我已经在这方面做了一段时间了,似乎无法弄清楚情况 - 部分因为我不完全理解发生了什么(这就是为什么我来到这里)。
我正在做一个提升你好世界,如下:
#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”选项重建了提升
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
我还在茫然。
答案 0 :(得分:5)
这组库文件:
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
适用于Visual Studio 2010编译器。他们不会与海湾合作委员会合作。如果你想使用gcc / MinGW,你需要为该编译器下载/构建一组boost库。或者,您可以安装VS 2010并使用该编译器(如果成本有问题,免费的VC ++ 2010 Express版本应该可以正常工作)。
你可以从http://nuwen.net/mingw.html(仅限32位目标,我相信)中获得包含Boost的MinGW发行版。
回答有关使用MinGW libs获取错误的信息:
符号上的_imp_
前缀表示g++
正在寻找链接到dll /共享库。你拥有的.lib文件用于静态库(这也是我在进行简单的bjam构建时所获得的)。如果查看boost/thread/detail/config.hpp
,您会看到对于Win32版本,除非正在使用MSVC或Intel编译器,否则它将默认为构建DLL库。
我甚至不确定如何构建DLL库 - 我必须查找它。在此期间,您可以使用以下命令构建示例,以便它将链接到静态库。 BOOST_THREAD_USE_LIB
宏构建.cpp文件,以便它可以链接到静态库:
g++ -I/Boost -DBOOST_THREAD_USE_LIB -c main.cpp
答案 1 :(得分:5)
解决了这个问题。 Boost的标头配置为动态链接,但除非您指定:
,否则不会构建动态库(dll)--build-type=complete
调用bjam时。之后,将相应的dll复制到您的应用程序目录,但仍然使用
-L/BOOST_DIR/stage/lib -lname
链接时。