奇怪的mingw链接器错误与提升?

时间:2011-07-12 02:45:25

标签: c++ boost linker g++ mingw

我已经在这方面做了一段时间了,似乎无法弄清楚情况 - 部分因为我不完全理解发生了什么(这就是为什么我来到这里)。

我正在做一个提升你好世界,如下:

#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

我还在茫然。

2 个答案:

答案 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
链接时