3

CORBA クライアントとして動作する C++ で PHP 拡張機能を作成しようとしています。

サーバー側はJavaで書かれています。実行環境は CentOS 6.6 です。

omn​​iORB を使用して 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

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 remi)、remi-release パッケージを削除し、EPEL リポジトリから最後に利用可能な php/gg/etc パッケージをインストールします (これらをダウングレードする必要がある場合があります)。rpm -Uvh package.rpm --oldversion)。次に、すべてのパッケージをアップグレードします。

同様の質問へのリンクは、ここここここ、さらにはここにあります。

これが役に立ったかどうか教えてください。

于 2015-07-01T08:35:33.103 に答える