我已经在做这个项目有一段时间了,但似乎无法理解情况——部分原因是我没有完全理解正在发生的事情(这也是我来这里的原因)。
我正在进行一种如下的boost hello world:
#include <boost/thread/thread.hpp>
#include <cstdio>
void helloworld() {
std::printf("HELLO FROM A BOOST THREAD!");
}
int main(int argc, char **argv) {
boost::thread t(&helloworld);
t.join();
}
这是在Windows平台下的操作。我将Boost目录存储在C:\Boost路径下。我运行了bootstrap和bjam命令,现在有一个stage/lib文件夹,其中包含所有的.lib文件。与boost/thread库相关的lib文件如下:
libboost_thread-vc100-mt.lib
libboost_thread-vc100-mt-1_46_1.lib
libboost_thread-vc100-mt-gd.lib
libboost_thread-vc100-mt-gd-1_46_1.lib
现在我进行编译:
g++ -c main.cpp -I/Boost
那一行工作得很好,我得到了main.o文件。然后:
g++ -o test.exe main.o -L/Boost/stage/lib -llibboost_thread-vc100-mt
这就是问题所在。首先,如果我没有像我现在这样输入-l参数,MinGW甚至无法找到文件。也就是说,如果我尝试:
-lboost_thread-vc100-mt
与我之前输入的方式(以及我认为应该这样做的方式)不同,如果使用这种方式,ld命令会因为找不到文件而退出。无论如何,这是我从那行代码中得到的输出结果:
main.o:main.cpp:(.text+0x47): undefined reference to `_imp___ZN5boost6thread4joinEv'
main.o:main.cpp:(.text+0x55): undefined reference to `_imp___ZN5boost6threadD1Ev'
main.o:main.cpp:(.text+0x70): undefined reference to `_imp___ZN5boost6threadD1Ev'
main.o:main.cpp:(.text$_ZN5boost6threadC1IPFvvEEET_NS_10disable_ifINS_14is_convertibleIRS4_NS_6detail13thread_move_tIS4_EEEEPNS0_5dummyEE4typeE[boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type)]+0x23): undefined reference to `_imp___ZN5boost6thread12start_threadEv'
collect2: ld returned 1 exit status
现在我可以看出,这些显然是我应该从boost/thread中获取的函数,而且它似乎找到了lib文件,那么为什么它没有正确链接呢?
非常感谢您的帮助!
编辑:
我已经使用bjam的“stage”选项重新构建了boost。
bjam toolset=gcc stage
现在,在构建完成后,我剩下一个stage/lib文件夹,其中包含.a文件,这是预期的结果。这些是与boost/thread相关的库:
libboost_thread-mgw45-mt-1_46_1.a
libboost_thread-mgw45-mt-d-1_46_1.a
然而,如下链接:
g++ -o test.exe main.o -L/Boost/stage/lib -lboost_thread-mgw45-mt-1_46_1
输出完全相同的错误。也尝试过:
g++ -o test.exe main.o -L/Boost/stage/lib -lboost_thread-mgw45-mt-1_46_1 -static
我仍然不知所措。
toolset=gcc
是不够的,你还需要target-os=windows
来使用 MinGW。 - ildjarn