3

我们正在尝试在 C++ 中创建一个 PHP 扩展,它将作为 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.

4

2 回答 2

1

该问题的解决方案是更改用于设置 php 扩展的 config.m4 文件,使其包含对使用PHP_ADD_LIBRARY_WITH_PATH宏而不是宏的omniORB库的引用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
于 2015-07-01T10:34:37.323 回答
0

来源更改:

有许多不同的原因可能导致 DLL 出现此类问题。首先 -确保所有文件都到位- midas 模块是否存在?在环境中是否有适当的参考?

确保设置了扩展- 确保你有 SO 模块,然后你的配置文件有 SO 类型作为扩展类型,或者换句话说,这行存在:

extension=module.so

如果这没有帮助,请考虑动态检查链接器 - 是加载中的错误,还是某些标题不适合?

让我知道发生了什么。

编辑:由于未定义的语法,错误似乎出在加载中。那么,是一个类似的案例,我将根据这个案例来回答。

您的错误意味着,ZTv0ortableServer11ServantBase9_downcastEv在模块使用的共享库中找不到该符号。它可能是由一个不是默认库的库提供的——不是 php-gd,可能是omniORB。

readelf -s <path to SO file>

nm -D <path to SO file>

将列出符号,我很确定,你不会在那里找到它。

可能有一个来自omniORB 类型的未更新库干扰了引用——例如,Remi 可能是其中之一。如果您的代码中有它,或者任何其他可能这样做的代码,您可以重置它们;

例如,如果您认为 remi 文件有干扰,您可以通过删除所有 remi 包rpm -qa|grep remirpm -Uvh package.rpm --oldversion)。然后升级所有软件包。

可以在此处此处此处甚至此处找到更多具有类似问题的链接。

让我知道这是否对您有帮助。

于 2015-07-01T08:35:33.103 回答