Использование библиотек Boost с mingw - PullRequest
4 голосов
/ 18 октября 2011

Я пытаюсь использовать потоки наддува на mingw (TDM-mingw, 32bit на основе gcc4.6) из qtcreator, используя qmake. Мне удалось скомпилировать boost 1.4.7 с помощью

bjam --toolset=gcc --layout=tagged  --without-mpi --without-python -j 4 stage --build-type=complete

Однако я просто не могу получить его по ссылке. Я пытался связать несколько созданных библиотек libboost_thread (libboost_thread.a, libboost_thread-mt.a, libboost_thread-mt-dll.a, libboost_thread-mt-s.a), однако это всегда приводит к тому, что

ld.exe: warning: cannot find entry symbol nable-stdcall-fixup; defaulting to 00401000
main.o:main.cpp:(.text.startup+0x76): undefined reference to `_imp___ZN5boost6thread12start_threadEv'
main.o:main.cpp:(.text.startup+0x89): undefined reference to `_imp___ZN5boost6thread4joinEv'
main.o:main.cpp:(.text.startup+0x9c): undefined reference to `_imp___ZN5boost6threadD1Ev'
main.o:main.cpp:(.text.startup+0xdb): undefined reference to `_imp___ZN5boost6threadD1Ev'

Код, который я пытаюсь скомпилировать, выглядит следующим образом:

#include <boost/thread.hpp>
struct thread_main
{ void operator()(){ std::cout<<"Hello World"<<std::endl; } };

int main(int argc, char* argv[])
{
   boost::thread thread((thread_main()));
   thread.join();
   return 0;
}

Инструкции компиляции, сгенерированные qmake, следующие:

 g++ -c -std=gnu++0x -fopenmp -march=i686 -mtune=generic -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I'e:/Qt/4.73/Desktop/Qt/4.7.3/mingw/include' -I'e:/Qt/4.73/Desktop/Qt/4.7.3/mingw/include/ActiveQt' -I'release' -I'../Test' -I'.' -I'e:/Qt/4.73/Desktop/Qt/4.7.3/mingw/mkspecs/win32-g++' -o main.o ../Test/main.cpp
 g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -Wl,-subsystem,console -mthreads -Wl -o Test.exe.exe main.o  -L'e:/boost/stage/lib' -L'e:/Qt/4.73/Desktop/Qt/4.7.3/mingw/lib' -fopenmp -l boost_thread 

Согласно этот должен быть скомпилирован с -DBOOST_THREAD_USE_LIB, однако это приводит только к

ld.exe: warning: cannot find entry symbol nable-stdcall-fixup; defaulting to 00401000
main.o:main.cpp:(.text.startup+0x75): undefined reference to `boost::thread::start_thread()'
main.o:main.cpp:(.text.startup+0x87): undefined reference to `boost::thread::join()'
main.o:main.cpp:(.text.startup+0x99): undefined reference to `boost::thread::~thread()'
main.o:main.cpp:(.text.startup+0xd7): undefined reference to `boost::thread::~thread()'

Так, как я могу настроить mingw для связи с boost_thread (или если это проблема с флагами компиляции, предоставленными компоновщику qmake, как мне настроить его, чтобы он пропускал проблемные флаги?

Ответы [ 4 ]

1 голос
/ 14 декабря 2012

Поздний ответ:

Вот полное описание того, как скомпилировать себя с помощью MinGW

... а также как настроить Eclipse для поиска заголовков и библиотек. Это не через qtcreator, но должно работать.

http://scrupulousabstractions.tumblr.com/post/37052323632/boost-mingw-eclipse

В итоге, скомпилируйте что-то вроде этого:

cd F:\coding\boost_1_52_0
.\bootstrap.bat
.\b2 --prefix=F:\coding\some_installation_location toolset=gcc 
       variant=debug,release link=static,shared threading=multi install -j3

(строка вариант = ... должна находиться на той же строке, что и. \ B2. Опция -j3 предназначена только для параллельного запуска 3 заданий.)

1 голос
/ 08 декабря 2011

Я исправил аналогичную ошибку, добавив строку определения:

#define BOOST_THREAD_USE_LIB

перед

#include <boost/thread.hpp>

, что, очевидно, заставляет компоновщик использовать библиотеку libboost_thread-mt.a в качестве статическогобиблиотека (как следует) и не пытается связать ее динамически или тому подобное.

, как предлагается здесь: Проблемы с блоками кода, MinGW, Boost и статическим связыванием

1 голос
/ 10 ноября 2011

Я думаю, вам нужно перечислить boost_thread перед main.o - порядок важен.

0 голосов
/ 15 ноября 2011

Только что я перекомпилировал boost еще раз, и теперь он работает, поэтому я предполагаю, что это был просто случай с bjam, использующим неправильную версию mingw по какой-то причине

...