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

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

2 ответа

Решением проблемы было изменение файла 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). Затем обновите все пакеты.

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

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

Другие вопросы по тегам