2012-01-10 14 views
4

私はMinGW32(Windows 7 64ビット版)でTBBを構築し、それに簡単なプログラムをうまくリンクしています。残念ながら、私の同僚はリンクをうまくできません。私たちは、同じバージョンのMinGW(mingw-get-inst-20110802)と同じバージョンのWindowsを実行しており、まったく同じコードをコンパイルしようとしています。私たちのPATH環境変数はまったく同じです(。:/ usr/local/bin:/ mingw/bin:/ bin)。しかし、すべてのことが同じであっても(私が知る限り)、プログラムを構築して実行することができます。私の大学の試みはリンクステップで失敗しました。私が彼にtbb.dllを渡すと、彼は彼のプログラムをうまくリンクすることができます。したがって、私は彼のtbb.dllのビルドに関して何か間違っていると信じられています。MinGWでTBBをビルド/リンクする

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

簡単なテストプログラム:私たちは、TBBを構築するために使用しているコマンドラインは、我々はすべてのオブジェクトファイルとライブラリ

$ 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 

のために32ビットのバイナリを生成していること(ファイルを使用して)確認しています私たちは、コンパイルされている。

#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シンボルを見つけ、問題を持っていることを示していると思われる::初期化()とtbb_task_schedule_init ::()を終了します。しかし、これらのシンボルの両方がtbb.dllに存在する(以下nmの出力は、彼と私の両方で同じです):誰もが私が構築できるようになる理由についてどのような提案を提供し、この単純な例をリンクすることができ

$ 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 

私の同僚が、同じ正確なツール、バイナリ、ソースコード、オペレーティングシステムなどを使用しているにもかかわらず、私の同僚がリンクできないときはどうでしょうか?

+0

あなたの同僚のマシン上に構築されたDLLと同じリンクの問題がありますか? –

+0

はい。私の同僚のマシン上に構築されたtbb.dllとリンクすると、 "初期化"と "終了"エラーと同じ未定義参照が表示されます。私自身のマシン上に構築されたtbb.dllに対してビルドすると、すべてうまくいきます。これは、問題が彼のtbb.dllの作成方法と関係していると私に信じさせる。 – user992113

+0

DLLの内容を比較することができます(nmや同様のツールを使用)、簡単に説明できない違いを探します。たぶん、これはあなたに間違っている可能性のある手がかりを与えるでしょう。 –

答えて

6

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

+1

ようこそStackoverflowへ!それが解決したら、その答えを受け入れる方がよいでしょう。 – menjaraz

関連する問題