3

インストールされているC++ライブラリ(Boost Date_Time)に依存するC++で記述されたPHPモジュールがあります。

現在、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
  ])

現在、これは現在の環境で機能しますが、ライブラリまたはコンパイラの別のバージョンでこれが機能しなくなる可能性があることを痛感しています。

マングルされていないC++シンボルをautomakeに理解させるにはどうすればよいですか?

編集:

マングルされた名前をチェックするのは恐ろしいことですが、「nm -C」によって返されるシンボル名をチェックする方法はありません(例:boost :: gregorian :: bad_monthなど)。

automakeコマンドAC_LANG_CPLUSPLUS()への参照を見つけましたが、それを使用する方法と、ここで適用できるかどうかはわかりません。

4

4 に答える 4

2

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])
])

これにより、マングルされていないシンボルの使用を回避できます。

于 2009-05-13T20:49:15.583 に答える
0

特定のC++コンパイラの環境の外では、「マングルされていないC ++シンボル」はありません。リンカやライブラリアンなどの外部ツールに一意の名前を付けるために、マングリングが正確に行われます。

于 2009-04-28T15:23:10.090 に答える
0

呼び出すBoostAPI関数の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(これにより、特定のコンパイラ実装への依存度がさらに高まることに注意してください)。

于 2009-04-28T15:28:38.690 に答える
0

これはひどい考えです-オープンに壊れたシンボルを出すこと。そもそもなぜこれが必要なのですか?

あなたの更新を見て、私は尋ねなければならないでしょう、なぜカスタムルールを使用してnmこの情報を呼び出して取得し、このルールを要件として渡すようにしませんか?autoconfオブジェクトファイルのシンボルをチェックする直接コマンドを提供するとしたら、私は非常に驚きます。

于 2009-04-28T15:29:21.590 に答える