使用带有mingw的Boost库

时间:2011-10-18 12:15:47

标签: c++ boost mingw qmake

我尝试使用qmake从qtcreator上使用mingw(TDM-mingw,基于gcc4.6的32位)的boost线程。我设法使用

编译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 

根据this,必须使用-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 个答案:

答案 0 :(得分:1)

我认为你需要在main.o之前列出boost_thread - 顺序很重要。

答案 1 :(得分:1)

我通过添加定义行修复了类似的错误:

#define BOOST_THREAD_USE_LIB

#include <boost/thread.hpp>

显然使链接器使用库libboost_thread-mt.a作为静态库(应该)而不是尝试动态链接它等。

如此处所示:Code Blocks, MinGW, Boost, and static linking issues

答案 2 :(得分:1)

迟到的答案:

以下是有关如何使用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

(variant = ... line与。\ b2位于同一行。选项-j3仅用于并行运行3个作业。)

答案 3 :(得分:0)

刚才我再次重新编译了boost,现在它正常工作,所以我认为这只是因为某种原因而使用错误的mingw版本的bjam案例