Я строю 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
Может кто-нибудь предложить какие-либо предложения относительно того, почему я смог бы построить и связать этот простой пример , когда мой коллега не может связаться, несмотря на то, что мы используем те же самые точные инструменты, двоичные файлы, исходный код, операционную систему и т. д.?
У вас есть те же проблемы с DLL, что и у вашей коллеги? –
Да. Если я связываюсь с tbb.dll, построенным на машине моего коллеги, я вижу ту же неопределенную ссылку на «инициализацию» и «завершение» ошибок. Если я строю против tbb.dll, построенного на моей собственной машине, тогда все будет хорошо. Это заставляет меня думать, что проблема связана с тем, как построен его tbb.dll. – user992113
Возможно, имеет смысл сравнить содержимое DLL (используя nm или аналогичный инструмент) и искать различия, которые вы не можете легко объяснить. Возможно, это даст вам некоторое представление о том, что может быть неправильным. –