我在一台 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包中的一个错误