2012-01-10 66 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