PHP 拡張機能を構築するときに、マングルされていない C++ シンボルを確認するにはどうすればよいですか?
-
18-09-2019 - |
質問
C++ で書かれた PHP モジュールがありますが、これはインストールされている C++ ライブラリ (Boost Date_Time) に依存しています。
現在、config.m4 ファイルで次のようにライブラリを確認しています。
LIBNAME=boost_date_time
LIBSYMBOL=_ZN5boost9gregorian9bad_monthD0Ev
PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
[
AC_MSG_ERROR([lib $LIBNAME not found. Try: sudo apt-get install libboost-dev])
],[
-lstdc++ -ldl
])
現在、これは私の現在の環境では機能しますが、別のバージョンのライブラリまたはコンパイラではおそらく機能しなくなることを痛感しています。
automake にマングルされていない C++ シンボルを理解させるにはどうすればよいですか?
編集:
壊れた名前をチェックするのはひどいことだと思いますが、「nm -C」によって返されるシンボル名をチェックする方法はありませんか(例:boost::gregorian::bad_monthなど)。
automake コマンド AC_LANG_CPLUSPLUS() への参照を見つけましたが、その使用方法とそれがここで適用できるかどうかはわかりません。
解決
あなたはそのようなものでAC_TRY_COMPILE
を確認することができます:
LIBNAME=boost_date_time
AC_MSG_CHECKING([for BOOST])
AC_TRY_COMPILE(
[
#include "boost/date_time/gregorian/greg_month.hpp"
],
[
boost::gregorian::bad_month* bm = new boost::gregorian::bad_month;
],
[
AC_MSG_RESULT(yes)
],
[
AC_MSG_ERROR([lib $LIBNAME not found. Try: sudo apt-get install libboost-dev])
])
このunmangled記号の使用を避けます。
他のヒント
は、特定のC ++コンパイラの環境の外では、何も「非マングルされたC ++シンボル」がない - 。マングリングは、このようなリンカーや図書館などの外部ツールに固有の名前を提供するために、正確に行われている。
これはひどいアイデアだ - オープンでマングルされたシンボルを持っています。あなたは最初の場所でこれを必要とするWhy'd?
あなたの更新を見たので、私はなぜnm
を起動し、この情報を取得し、このルールが要件として渡すことができるようにすることカスタムルールを使用しない、依頼する必要があるだろうか? autoconf
は、シンボルのオブジェクトファイルをチェックするために、直接コマンドを提供することだった場合、私は非常に驚くだろう。
呼び出す Boost API 関数用の C++ ラッパーのセットを提供する必要があります。これらのラッパーは次のように宣言する必要があります extern "C"
, 、次のように:
extern "C"
void foo(int bar)
{
...
}
PHP コードでは、C++ メソッドを直接呼び出すのではなく、これらのラッパーを使用する必要があります。
編集:の可用性を前提としているため、 automake
, おそらく、インストールの一部として Boost ライブラリをコンパイルすることを計画しているでしょう。これにより、名前のマングリングの結果を調査するオプションが提供されます。これらの方針に沿ってテスト C++ プログラムを作成してみてください。 これはコンパイルするだけでよいことに注意してください;有効な結果を生成する必要はありません。
#include "boost/date_time/gregorian/greg_month.hpp"
int main( int argc, const char* argv[] )
{
boost::gregorian::bad_month* xxxjunk = new boost::gregorian::bad_month;
return 0;
}
automake では、これをコンパイルしてから出力を実行します。
nm -C | grep "boost::gregorian::bad_month"
ニーズと好みに応じて、さらに改良することもできます。 grep
文字列を検索するコマンド「typeinfo for boost::gregorian::bad_month
(これにより、特定のコンパイラ実装への依存度がさらに高まることに注意してください。)