3

我在一台 Fedora 19 x86_64 计算机上,安装了 mingw64 和所有相关软件包。我正在做一个个人 c++ 项目,我决定让它成为线程安全的,所以我决定尝试一下 Boost.thread 同步对象。一旦我这样做了,我就开始收到与 InterlockedCompareExchange 相关的链接器错误。以下测试程序说明了我的观点:

#include <boost/thread/locks.hpp>
#include <boost/thread/shared_mutex.hpp>

int main()
{
    boost::shared_mutex mtx;
    boost::unique_lock<decltype(mtx)> lck{mtx};
}

这是命令行(我放了 -lboost_thread-mt 因为没有非多线程版本,这是有道理的):

$ x86_64-w64-mingw32-g++ -std=c++11 test.cpp -o test -I/usr/x86_64-w64-mingw32/sys-root/mingw/include -L/usr/x86_64-w64-mingw32/ sys-root/mingw/lib -lboost_thread-mt -lboost_system

/tmp/cc4Wh6PO.o:test.cpp:(.text$_ZN5boost12shared_mutex28interlocked_compare_exchangeINS0_10state_dataEEET_PS3_S3_S3_[_ZN5boost12shared_mutex28interlocked_compare_exchangeINS0_10state_dataEEET_PS3_S3_S3_]+0x2f):未定义引用`InterlockedCompareExchange 退出状态:收集'2

但是使用 mingw32 它编译起来就像一个魅力:

$ i686-w64-mingw32-g++ -std=c++11 test.cpp -o test -I/usr/i686-w64-mingw32/sys-root/mingw/include -L/usr/i686-w64-mingw32/ sys-root/mingw/lib -lboost_thread-mt -lboost_system

我的问题是:我做错了什么还是 mingw64 中的错误?它是否与 mingw 的 windows 版本一起编译?

编辑:实际上确实如此,所以它一定是fedora mingw64包中的一个错误

4

3 回答 3

4

Based on this page http://sourceforge.net/apps/trac/mingw-w64/wiki/Building%20Boost, you can add define=BOOST_USE_WINDOWS_H to avoid that linking error. It works for me.

于 2013-10-10T05:39:40.763 回答
2

事实上,我仍然得到相同的结果,所以我一定会报告它。谢谢

于 2013-08-12T16:24:39.240 回答
0

我遇到了对 Interlocked* 函数的未定义引用的类似问题。据我所知,来自 MinGWBuilds 项目(在 sf 上)的 mingw64 rev2 正在工作,而 rev3 没有工作。所以我相信这在 MinGW64 中有所改变。

于 2013-08-27T18:42:25.777 回答