2015-07-01 34 views
3

我們試圖在C++中創建一個PHP擴展,它將作爲CORBA客戶端運行。PHP擴展帶有omniORB庫的CORBA客戶端給出了運行時錯誤「undefined symbol」

服務器端是用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.

回答

0

Source:

改變的有可能導致這樣的問題與許多不同的原因DLL文件。首先 - 確保所有文件都已到位 - midas模塊是否存在?在環境中是否有適當的參照?

確保擴展設置 - 確保您有SO模塊,然後您的配置文件具有SO類型作爲擴展類型,或者換句話說,這條線存在:

extension=module.so 

如果這沒有幫助,請考慮動態檢查鏈接器 - 是加載中的錯誤,還是某些頭文件不適合?

讓我知道發生了什麼事。

編輯:這似乎是錯誤是在加載beuse使用未定義的語法。那麼,here是一個類似的情況,我會根據我的答案。

您的錯誤意味着,在模塊使用的共享庫中找不到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軟件包並安裝EPEL存儲庫中最後一個可用的php/gg/etc軟件包來重置它們(您可以需要用rpm -Uvh package.rpm --oldversion降級它們)。然後升級所有軟件包。

對於類似問題,一些更多的鏈接,可以發現hereherehere,甚至here.

讓我知道,如果這有助於你。

+0

你好,我已經驗證過他的文件已經到位,並且相對於php.ini的引用是正確的。至於「動態檢查鏈接器」,我真的不知道該怎麼做。 – thanassis

+0

@thanassis看看我的編輯。 –

1

問題的解決方案是更改用於設置php擴展名的config.m4文件,以便它包含對使用PHP_ADD_LIBRARY_WITH_PATH宏而不是PHP_ADD_LIBRARY之一的omniORB庫的引用,儘管這些庫位於默認/ 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 
+0

爲了公平起見,我確實告訴你檢查擴展名(無論如何,我很高興聽到你解決了它,+1 –

相關問題