Расширение PHP Клиент CORBA с библиотеками omniORB выдает ошибку времени выполнения с & quot; неопределенным символом & quot;

Мы пытаемся создать расширение 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.

3

Решение

Решением проблемы было изменение файла 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
1

Другие решения

Изменено с Источник:

Есть много разных причин, которые могут вызвать такую ​​проблему с 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). Затем обновите все пакеты.

Еще несколько ссылок с похожими вопросами можно найти Вот, Вот, Вот, и даже Вот.

Дайте мне знать, если это вам помогло.

0

По вопросам рекламы [email protected]