Строительство / Связь с TBB под MinGW - PullRequest
4 голосов
/ 10 января 2012

Я создаю TBB под MinGW32 (в Windows 7 64 bit) и успешно связываю с ним простую программу.К сожалению, мой коллега не может сделать ссылку успешно.Мы оба используем одну и ту же версию 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 ../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

Может кто-нибудь предложить какое-либо предложение относительно того, почему я смог бы построить и связать этопростой пример, когда мой коллега не может связать, несмотря на то, что мы используем одни и те же точные инструменты, двоичные файлы, исходный код, операционную систему и т. д. ??

1 Ответ

6 голосов
/ 13 января 2012

решаемая.Похоже, это дефект MinGW, в частности ld.exe.Возврат из версии 2.21.1 ld в версию 2.21 ld решает проблему.Мы с коллегой использовали разные версии ld

...