c++ - 奇怪的 mingw 链接器错误与 boost ?

标签 c++ boost linker g++ mingw

我已经为此工作了一段时间,但似乎无法理解这种情况 - 部分原因是我不完全了解发生了什么(这就是我来这里的原因)。

我正在做一种 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/

相关文章:

c++ - 内存有效的字符串 vector

c++ - Qt:QSslSocket::bytesWritten() 信号发出得太频繁

c++ - 存储指向 Boost MultiSet 索引的引用/指针

c++ - 使用 boost::filesystem 时出错

找不到 C++ 虚函数

c++ - 什么会导致异常 16 : "mutex: Resource busy" to be thrown (using Boost/BB10)?

c++ - 如果模板参数不允许实例化某个类,如何编写模板重载函数并触发回退

c++ - 是否有用于拆分 std::pair 的标准 C++ 函数对象?

c - 将多个 C 库链接到 C 创建可执行文件

c++ - C 中的链接器错误。使用 <graphics.h> Turbo C++