我已经为此工作了一段时间,但似乎无法理解这种情况 - 部分原因是我不完全了解发生了什么(这就是我来这里的原因)。
我正在做一种 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,现在有一个包含所有 .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
我还是很迷茫。
最佳答案
问题解决了。 Boost 的 header 被配置为动态链接,但除非您指定,否则不会构建动态库 (dll):
--build-type=complete
当调用 bjam 时。之后,将相应的 dll 复制到您的应用程序目录,但仍然使用
-L/BOOST_DIR/stage/lib -lname
链接时。
关于c++ - 奇怪的 mingw 链接器错误与 boost ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6658981/