【发布时间】:2011-07-12 02:45:25
【问题描述】:
我已经为此工作了一段时间,但似乎无法理解这种情况 - 部分原因是我不完全了解发生了什么(这就是我来这里的原因)。
我正在做一种提升你好世界如下:
#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,现在有了一个包含所有 .lib 文件的 stage/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
现在,在构建完成后,我留下了一个包含 .a 文件的 stage/lib 文件夹,正如预期的那样。这些是 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是不够的,MinGW还需要target-os=windows。
标签: c++ boost linker g++ mingw