Мы пытаемся создать расширение PHP на C ++, которое будет работать как клиент CORBA.
Серверная часть написана на Java. Наша среда выполнения — CentOS 6.6.
Мы использовали omniORB для компиляции IDL и создания скелетного кода C ++ для клиента. Нашим первым шагом было создание клиентской программы, которая работает правильно. Затем мы включили эту функциональность в расширение PHP, которое компилирует и связывает без каких-либо ошибок.
Однако когда наша библиотека расширений установлена и протестирована на PHP, мы получаем следующую ошибку:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/php_midas.so' - /usr/lib64/php/modules/php_midas.so: undefined symbol: _ZTv0ortableServer11ServantBase9_downcastEv in Unknown on line 0.
Решением проблемы было изменение файла config.m4, используемого для настройки расширения php, чтобы он включал ссылки на библиотеки omniORB с помощью PHP_ADD_LIBRARY_WITH_PATH
макрос вместо PHP_ADD_LIBRARY
один, хотя библиотеки были в папке по умолчанию / usr / lib64.
Я включаю весь файл в качестве рабочей ссылки.
dnl PHP extension definition written in C++ that uses the omniORB libraries
PHP_ARG_ENABLE(php_midas, whether to enable midas extension, [ --enable-php-midas Enable PHP Midas extension])
if test "$PHP_MIDAS" != "no"; then
dnl -- Add support for standard C++ runtime
PHP_ADD_LIBRARY_WITH_PATH( stdc++, /usr/lib64/, PHP_MIDAS_SHARED_LIBADD)
dnl -- Incldue the omniORB libraries
PHP_ADD_LIBRARY_WITH_PATH(omniCodeSets4, /usr/lib64/, PHP_MIDAS_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(omniConnectionMgmt4, /usr/lib64/, PHP_MIDAS_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(omniDynamic4, /usr/lib64/, PHP_MIDAS_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(omniORB4, /usr/lib64/, PHP_MIDAS_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(omnithread, /usr/lib64/, PHP_MIDAS_SHARED_LIBADD)
dnl -- Our extension consists of two cpp files
PHP_NEW_EXTENSION(php_midas, php_midas.cpp coordinatesConverterSK.cpp, $ext_shared)
PHP_SUBST(PHP_MIDAS_SHARED_LIBADD)
dnl -- Declare C++ extension
PHP_REQUIRE_CXX()
fi
Изменено с Источник:
Есть много разных причин, которые могут вызвать такую проблему с DLL. Первый — Убедитесь, что все файлы на месте — существует ли там модуль midas? есть ли надлежащая ссылка на это в окружающей среде?
Убедитесь, что расширение установлено -Убедитесь, что у вас есть модуль SO, а затем ваш файл конфигурации имеет тип SO в качестве типа расширения, или, другими словами, эта строка существует:
extension=module.so
Если это не помогло, рассмотрите возможность динамической проверки компоновщика — ошибка загрузки или некоторые заголовки не подходят?
Дайте мне знать, что случилось.
РЕДАКТИРОВАТЬ: Кажется, что ошибка в загрузке из-за неопределенного синтаксиса. Ну тогда, Вот Это аналогичный случай, на котором я буду основывать свой ответ.
Ваша ошибка означает, что ZTv0ortableServer11ServantBase9_downcastEv
Символ не может быть найден в общих библиотеках, используемых модулем. Вероятно, он предоставляется библиотекой, которая не является defualt — не php-gd, вероятно, omniORB.
readelf -s <path to SO file>
а также
nm -D <path to SO file>
будет перечислять символы, и я очень уверен, что вы не найдете его там.
Вероятно, существует не обновленная библиотека типа omniORB, мешающая ссылке — например, Remi может быть одной. Если у вас есть это в вашем коде или любом другом, который может это сделать, вы можете сбросить их;
Например, если вы считаете, что файлы remi создают помехи, вы можете сбросить их, удалив все пакеты remi (rpm -qa|grep remi
), удалите пакет remi-release и установите последние доступные пакеты php / gg / etc из репозитория EPEL (вам может потребоваться понизить их до rpm -Uvh package.rpm --oldversion
). Затем обновите все пакеты.
Еще несколько ссылок с похожими вопросами можно найти Вот, Вот, Вот, и даже Вот.
Дайте мне знать, если это вам помогло.