4

MinGW32(Windows 7 64ビット)でTBBを構築し、単純なプログラムを正常にリンクしています。残念ながら、私の同僚は正常にリンクできません。どちらも同じバージョンのWindows、同じバージョンのMinGW(mingw-get-inst-20110802)を実行しており、まったく同じコードをコンパイルしようとしています。PATH環境変数はまったく同じです(.:/usr/local/bin:/mingw/bin:/bin)。それでも、すべてが同じであるにもかかわらず(私が知る限り)、プログラムを正常にビルドして実行できますが、リンクステップでの同僚の試みは失敗しました。私が彼に私のtbb.dllを与えると、彼は彼のプログラムを正常にリンクすることができます。したがって、私は彼のtbb.dllのビルドに何か問題があると信じさせられます。すべてのオブジェクトファイルとライブラリに対して32ビットバイナリを生成していることを(ファイルを使用して)確認しました

    $ file a.exe
    a.exe: PE32 executable for MS Windows (console) Intel 80386 32-bit
    $ file ./tbb/tbb30_20110704oss/lib/tbb.dll
    ./tbb/tbb30_20110704oss/lib/tbb.dll: PE32 executable for MS Windows (DLL) (console) Intel 80386 32-bit

TBBのビルドに使用しているコマンドラインは次のとおりです。

    mingw32-make compiler=gcc arch=ia32 runtime=mingw tbb

コンパイルしている簡単なテストプログラムは次のとおりです。

    #include <tbb/task_scheduler_init.h>
    using namespace tbb;
    int main() {
    task_scheduler_init init;
    return 0;
    }

簡単なテストプログラムを作成するために使用しているコマンドライン

    g++ test1.cpp -I ./tbb/tbb30_20110704oss/include -L ./tbb/tbb30_20110704oss/lib -ltbb

私の場合、それは完璧に構築され、リンクされます。彼の場合、彼はエラーメッセージを受け取ります:

    test1.o: In function `tbb::task_scheduler_init::task_scheduler_init(int, unsigned int)':
    test1.cpp:(.text._ZN3tbb19task_scheduler_initC1Eij[tbb::task_scheduler_init::task_scheduler_init(int, unsigned int)]+0x33): undefined reference to `tbb::task_scheduler_init::initialize(int, unsigned int)'
    test1.o: In function `tbb::task_scheduler_init::~task_scheduler_init()':
    test1.cpp:(.text._ZN3tbb19task_scheduler_initD1Ev[tbb::task_scheduler_init::~task_scheduler_init()]+0x16): undefined reference to `tbb::task_scheduler_init::terminate()'

このメッセージは、リンカがシンボルtbb :: task_scheduler_init :: initialize()およびtbb_task_schedule_init :: terminate()を見つけるのに問題があることを示しているようです。ただし、これらのシンボルは両方ともtbb.dllに存在します(以下のnm出力は、彼とIの両方で同じです)。

    $ nm ../tbb/tbb30_20110704oss/lib/tbb.dll | grep task_scheduler_init
    676c9cb8 T __ZN3tbb19task_scheduler_init10initializeEi
    676c9c2c T __ZN3tbb19task_scheduler_init10initializeEij
    676c9b64 T __ZN3tbb19task_scheduler_init19default_num_threadsEv
    676c9afc T __ZN3tbb19task_scheduler_init9terminateEv

同じツール、バイナリ、ソースコード、オペレーティングシステムなどを使用しているにもかかわらず、同僚がリンクできない場合に、なぜこの単純な例を作成してリンクできるのかについて、誰かが提案できますか?

4

1 に答える 1

6

解決しました。これは、MinGW、特に ld.exe の欠陥のようです。ld バージョン 2.21.1 から ld バージョン 2.21 に戻すと、問題が解決します。同僚と私は異なるバージョンの ld を使用していました

于 2012-01-12T22:12:11.680 に答える