如何在 Eclipse 中使用 MinGW 编译 boost 线程?

Posted

技术标签:

【中文标题】如何在 Eclipse 中使用 MinGW 编译 boost 线程?【英文标题】:How to compile boost thread using MinGW in Eclipse? 【发布时间】:2013-09-07 08:04:10 【问题描述】:
#include <boost/thread/thread.hpp>
#include <iostream>

using namespace std;

void hello() 
    cout << "Hello world, I'm a thread!" << endl;


int main(int argc, char* argv[]) 
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!

    boost::thread thrd(&hello);
    thrd.join();
    return 0;

我确信上面的代码没有任何问题,因为我已经在 Microsoft Visual Studio Express Edition 上对其进行了测试。但它不能在 Eclipse 中编译。

我在 Windows 机器上执行此操作,我正在使用带有 MinGW 工具链的 Eclipse Kepler,我使用此命令 ./b2 install --with-thread --libdir=stage/lib --includedir=stage/include --build-type=complete stage toolset=msvc 在此目录 D:/tool/boost_1_54_0 中安装 boost。我在Libraries (-l) 部分(项目属性> C/C++ 构建> 设置> MinGW C++ 链接器> 库)中配置了额外的包含目录、库路径和线程库,即boost_thread-vc110-mt-1_54libboost_system-vc110-mt-1_54

这是编译的输出,你看出什么线索了吗?

15:52:07 **** Incremental Build of configuration Debug for project Cpp2 ****
Info: Internal Builder is used for build
g++ "-LD:\\tool\\boost_1_54_0\\stage\\lib" -o Cpp2.exe "src\\Cpp2.o" -llibboost_thread-vc110-mt-1_54 -llibboost_system-vc110-mt-1_54 
src\Cpp2.o: In function `_static_initialization_and_destruction_0':
D:/tool/boost_1_54_0/boost/system/error_code.hpp:222: undefined reference to `boost::system::generic_category()'
D:/tool/boost_1_54_0/boost/system/error_code.hpp:223: undefined reference to `boost::system::generic_category()'
D:/tool/boost_1_54_0/boost/system/error_code.hpp:224: undefined reference to `boost::system::system_category()'
src\Cpp2.o: In function `thread_exception':
D:/tool/boost_1_54_0/boost/thread/exceptions.hpp:51: undefined reference to `boost::system::system_category()'
src\Cpp2.o: In function `thread_data_base':
D:/tool/boost_1_54_0/boost/thread/win32/thread_data.hpp:123: undefined reference to `vtable for boost::detail::thread_data_base'
src\Cpp2.o: In function `ZN5boost6thread12start_threadEv':
D:/tool/boost_1_54_0/boost/thread/detail/thread.hpp:180: undefined reference to `boost::thread::start_thread_noexcept()'
src\Cpp2.o: In function `~thread':
D:/tool/boost_1_54_0/boost/thread/detail/thread.hpp:255: undefined reference to `boost::thread::detach()'
src\Cpp2.o: In function `ZN5boost6thread4joinEv':
D:/tool/boost_1_54_0/boost/thread/detail/thread.hpp:751: undefined reference to `boost::thread::get_id() const'
D:/tool/boost_1_54_0/boost/thread/detail/thread.hpp:751: undefined reference to `boost::this_thread::get_id()'
D:/tool/boost_1_54_0/boost/thread/detail/thread.hpp:756: undefined reference to `boost::thread::join_noexcept()'
src\Cpp2.o: In function `~thread_data':
D:/tool/boost_1_54_0/boost/thread/detail/thread.hpp:91: undefined reference to `boost::detail::thread_data_base::~thread_data_base()'
collect2: ld returned 1 exit status

【问题讨论】:

【参考方案1】:

-llibboost_thread-vc110-mt-1_54

应该是

-lboost_thread-vc110-mt-1_54

我使用 boost_1.45 为我工作,并带有以下命令行选项

-IC:\MinGW\boost_1_45_0 -LC:\MinGW\boost_1_45_0\stage\lib -lboost_thread-mgw46-mt-1_45

【讨论】:

我注意到你的库名称包含mgw46,而我的一个在编译过程中显示g++ "-LD:\\tool\\boost_1_54_0\\stage\\lib" -o Cpp2.exe "src\\Cpp2.o" -lboost_thread-vc110-mt-1_54 -lboost_system-vc110-mt-1_54,这有关系吗?我的意思是我需要在 boost 编译期间配置 MinGW 工具集吗?参考文档,通过指定toolset=gcc会自动配置GCC/MinGW兼容库进行boost。 @huahsin68 可能是另一个问题,你需要使用Mingw构建boost库【参考方案2】:

首先在 boost_1_##_0/ 中运行 bootstrap.bat mingw 然后 b2 toolset=gcc

一段时间后,您应该会得到一个填充的 boost_1_##_0/stage/lib 文件夹,其中包含 libboost_thread-mgw48-mt-1_55.a(或类似名称)。

然后,您需要在项目属性中添加 boost_1_##_0/stage/lib 作为 MinGW C++ 链接器的库路径,并将 boost_system-mgw48-mt-1_55boost_thread-mgw48-mt-1_55 添加为不带 lib 前缀和 的库>.a 结尾。 (顺序也可能很重要,如果不是,请尝试将系统放在首位)

【讨论】:

以上是关于如何在 Eclipse 中使用 MinGW 编译 boost 线程?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Mingw-64在 Kali Linux上编译Windows漏洞

eclipse+mingw 编译c++出错,请大神门帮我看看!!!

如何在 minGW 中禁用 Eclipse 中的未使用变量警告?

Eclipse 发现错误的 GCC (Windows)

用 MinGW 配置 Eclipse 3.7?

MinGW 编译问题