cem*_*ate 4 c++ linker boost mingw g++
我已经在这方面做了一段时间了,似乎无法理解这种情况 - 部分因为我不完全理解发生了什么(这就是我来到这里的原因).
我正在做一个提升你好世界如下:
#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();
}
Run Code Online (Sandbox Code Playgroud)
这是在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
Run Code Online (Sandbox Code Playgroud)
现在我编译:
g++ -c main.cpp -I/Boost
Run Code Online (Sandbox Code Playgroud)
那行很好,我得到main.o. 然后:
g++ -o test.exe main.o -L/Boost/stage/lib -llibboost_thread-vc100-mt
Run Code Online (Sandbox Code Playgroud)
这就是麻烦发生的地方.首先,如果我没有像我那样输入-l参数,MinGW甚至找不到该文件.意思是,如果我尝试:
-lboost_thread-vc100-mt
Run Code Online (Sandbox Code Playgroud)
而不是我在上面键入它的方式(以及我认为应该如何完成),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
Run Code Online (Sandbox Code Playgroud)
现在在那里的某个地方,我可以说这些显然是我应该从boost/thread得到的函数,显然它确实找到了lib文件,为什么它没有正确链接?
非常感谢您的帮助!
编辑:
我使用bjam"stage"选项重建了boost
bjam toolset=gcc stage
Run Code Online (Sandbox Code Playgroud)
现在,在构建完成之后,我留下了带有.a文件的stage/lib文件夹,正如预期的那样.这些是与boost/thread相关的库:
libboost_thread-mgw45-mt-1_46_1.a
libboost_thread-mgw45-mt-d-1_46_1.a
Run Code Online (Sandbox Code Playgroud)
但是,链接如下:
g++ -o test.exe main.o -L/Boost/stage/lib -lboost_thread-mgw45-mt-1_46_1
Run Code Online (Sandbox Code Playgroud)
输出完全相同的错误.还尝试过:
g++ -o test.exe main.o -L/Boost/stage/lib -lboost_thread-mgw45-mt-1_46_1 -static
Run Code Online (Sandbox Code Playgroud)
我还是不知所措.
这组库文件:
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
Run Code Online (Sandbox Code Playgroud)
适用于Visual Studio 2010编译器.他们不会与海湾合作委员会合作.如果你想使用gcc/MinGW,你需要为该编译器下载/构建一组boost库.或者,您可以安装VS 2010并使用该编译器(如果成本有问题,免费的VC++ 2010 Express版本应该可以正常工作).
您可以从http://nuwen.net/mingw.html(仅限32位目标,我相信)中获得包含Boost的MinGW发行版.
要回答有关使用MinGW库获取错误的问题:
在_imp_上的符号的前缀是指示g++正在寻找链接到AA 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
Run Code Online (Sandbox Code Playgroud)
解决了这个问题.Boost的标头配置为动态链接,但除非您指定,否则不会构建动态库(dll):
--build-type=complete
Run Code Online (Sandbox Code Playgroud)
在调用bjam时.之后,将相应的dll复制到您的应用程序目录,但仍然使用
-L/BOOST_DIR/stage/lib -lname
Run Code Online (Sandbox Code Playgroud)
链接时
| 归档时间: |
|
| 查看次数: |
4925 次 |
| 最近记录: |