2012-01-10 2 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 :: Initialize() и 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, что и у вашей коллеги? –

+0

Да. Если я связываюсь с tbb.dll, построенным на машине моего коллеги, я вижу ту же неопределенную ссылку на «инициализацию» и «завершение» ошибок. Если я строю против tbb.dll, построенного на моей собственной машине, тогда все будет хорошо. Это заставляет меня думать, что проблема связана с тем, как построен его tbb.dll. – user992113

+0

Возможно, имеет смысл сравнить содержимое DLL (используя nm или аналогичный инструмент) и искать различия, которые вы не можете легко объяснить. Возможно, это даст вам некоторое представление о том, что может быть неправильным. –

ответ

6

РЕШЕНИЕ. Это, по-видимому, является дефектом в MinGW, в частности ld.exe. Возврат из ld версии 2.21.1 в ld версии 2.21 решает проблему. Мой коллега и я использовали разные версии ld

+1

Добро пожаловать в Stackoverflow! Если он ее разрешил, было бы лучше принять ответ. – menjaraz

Смежные вопросы