私はあなたが何を考えているか知っています - これは何百万回も答えられています. ライブラリの順序が重要であることを既に知っていることを明確にするような何かをタイトルに入れることができればいいのにと思います。
Centos 6 64 で g++ を使用しています。簡単なテスト プログラムがあります。
#include <ptlib.h>
int main()
{
PTimer indirectTimer1_;
indirectTimer1_.SetNotifier(0);
return 0;
}
そして、次のコマンドでコンパイルしてリンクします。
g++ -I./ptlib/include/ mm.cpp ptlib/lib_linux_x86_64/libpt_s.a -lpthread -lrt
そして、私はこれを答えとして返します:
/tmp/cc53itXb.o: In function `main':
mm.cpp:(.text+0x52): undefined reference to `PTimer::SetNotifier(PNotifierTemplate<int> const&)'
collect2: ld returned 1 exit status
しかし、私は PTimer::SetNotifier が .a ファイルにあることを知っています:
nm -AC ptlib/lib_linux_x86_64/libpt_s.a | grep SetNotifier
ptlib/lib_linux_x86_64/libpt_s.a:osutil.o:0000000000003dd8 T PTimer::SetNotifier(PNotifierTemplate<long> const&)
さらにややこしいことに、Centos 5、32 ビットでライブラリをコンパイルし、同じテストを実行すると、問題なくリンクします。
「-Lptlib/lib_linux_x86_64 -lpt_s」を使用してみましたが、-Wl,--start-group / -Wl,--end-group args を使用してみましたが、役に立ちませんでした。'ptlib/src/ptlib/unix/osutil.cxx' を g++ 行に追加すると、問題なくコンパイルおよびリンクされます。残念ながら、これはメイン プログラムで参照されていない関数のサンプルにすぎません。すべてではなく、このようないくつかの一見ランダムなメソッドが未定義です (Centos 5、32 ビットでも問題なくリンクします)。
ご覧のとおり、私は多くのことを試しましたが、まだ理解していません。他に試してみたいことがあります。または、私が間違っていることを非常に簡単に指摘する誰か。