【发布时间】:2011-12-10 01:26:13
【问题描述】:
我正在尝试使用 qmake 在 qtcreator 的 mingw(TDM-mingw,基于 gcc4.6 的 32 位)上使用 boost 线程。我设法使用
编译了 boost 1.4.7bjam --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 给链接器的编译标志有问题,我如何说服它忽略有问题的标志?
【问题讨论】:
-
您是否尝试过链接 boost_thread-mt-dll?
-
你也应该去掉
-enable-stdcall-fixup,至少改成-Wl,--enable-stdcall-fixup... -
@rubenvb:你知道在 qmake 下怎么做吗?所有 -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -Wl,-subsystem,console -mthreads -Wl 似乎都已添加到某处qmake 内部
-
Grizzly:你使用的是什么版本的 Qt。我的 qmake.conf(位于
<Qt>/mkspecs/win32-g++)没有它(4.8git)。如果它在那里,只需在它前面添加-Wl,(中间没有空格)。