2012-01-10 67 views
4

建立TBB在MinGW32下(在Windows 7 64位),併成功地鏈接一個簡單的程序。不幸的是,我的同事無法成功鏈接。我們都運行相同版本的Windows,相同版本的MinGW(mingw-get-inst-20110802),並試圖編譯完全相同的代碼。我們的PATH環境變量完全相同(。:/ usr/local/bin:/ mingw/bin:/ bin)。然而,儘管所有的事情都是平等的(據我所知),我可以成功地構建和運行該程序,我的同事嘗試在鏈接步驟失敗。如果我給他我的tbb.dll,那麼他可以成功地鏈接他的程序。因此,我被引導認爲他的tbb.dll構建存在一些問題。我們已經證實了(使用文件),我們生產的所有目標文件的32位二進制文​​件和庫建立/鏈接到TBB在MinGW

$ 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 ::初始化()問題,tbb_task_schedule_init ::結束()。然而這兩個符號的tbb.dll存在(下面的納米輸出是兩個相同的他和我):

$ 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具有相同的鏈接問題? – 2012-01-11 15:23:41

+0

是的。如果我鏈接到建立在我的同事機器上的tbb.dll,那麼我會看到與「初始化」和「終止」錯誤相同的未定義參考。如果我建立在我自己的機器上構建的tbb.dll,那麼一切都很好。這導致我相信這個問題與他的tbb.dll的構建方式有關。 – user992113 2012-01-11 21:56:45

+0

比較DLL的內容(使用nm或類似工具)並查找不容易解釋的差異可能是有意義的。也許這會給你一些什麼是錯的線索。 – 2012-01-12 14:00:47

回答

6

已解決。這似乎是MinGW中的缺陷,特別是ld.exe。從ld版本2.21.1恢復到ld版本2.21解決了這個問題。我的同事和我正在使用不同版本的ld

+1

歡迎來到Stackoverflow!如果它已經解決了,最好接受答案。 – menjaraz 2012-01-13 03:06:07