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 输出对于他和我来说都是相同的):

    $ 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 回答