C++ 在mingw64(但不在mingw32)上使用boost.thread对InterlocatedCompareeExchange的未定义引用

C++ 在mingw64(但不在mingw32)上使用boost.thread对InterlocatedCompareeExchange的未定义引用,c++,linker,mingw,boost-thread,mingw-w64,C++,Linker,Mingw,Boost Thread,Mingw W64,我在Fedora19 x86_64计算机上,安装了mingw64和所有相关软件包。我正在研究一个个人C++项目,我决定让它成为线程安全的,所以我决定尝试给BooSt.Type同步对象。我一开始就发现了与InterlocatedCompareeExchange相关的链接器错误。以下测试程序说明了我的观点: #include <boost/thread/locks.hpp> #include <boost/thread/shared_mutex.hpp> int main(

我在Fedora19 x86_64计算机上,安装了mingw64和所有相关软件包。我正在研究一个个人C++项目,我决定让它成为线程安全的,所以我决定尝试给BooSt.Type同步对象。我一开始就发现了与InterlocatedCompareeExchange相关的链接器错误。以下测试程序说明了我的观点:

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

int main()
{
    boost::shared_mutex mtx;
    boost::unique_lock<decltype(mtx)> lck{mtx};
}
#包括
#包括
int main()
{
boost::共享互斥mtx;
boost::unique_lock lck{mtx};
}
下面是命令行(我放了-lboost_thread-mt,因为没有非多线程版本,这很有意义):

$x86_64-w64-mingw32-g++-std=c++11 test.cpp-o test -I/usr/x86\u 64-w64-mingw32/sys root/mingw/include-L/usr/x86\u 64-w64-mingw32/sys root/mingw/lib-lboost\u thread-mt-lboost\u系统

/tmp/cc4Wh6PO.o:test.cpp:(.text$ZN5Boost12共享\u Mutex28互锁\u比较\u交换0\u 10状态\u数据集\u PS3\u S3\u[\u ZN5Boost12共享\u Mutex28互锁\u比较\u 10状态\u数据集\u PS3\u S3\u]+0x2f): 对“InterlocatedCompareeExchange”集合2的未定义引用:错误: ld返回1个退出状态

但使用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\u thread-mt-lboost\u system

我的问题是:我是做错了什么,还是它是mingw64中的一个bug?它是否使用windows版本的mingw编译


编辑:事实上是这样的,所以它一定是fedora mingw64软件包中的一个bug

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

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

基于此页面,您可以添加define=BOOST\u USE\u WINDOWS\H以避免链接错误。这对我很有用。

这个问题似乎离题了,因为它是一个bug报告。这是最近修复的。尝试从Fedora repos更新您的工具链。如果您再次遇到这种情况,请向Fedora tracker提交一份错误报告,而不是使用Stackoverflow作为修复所有问题的工具。我已经放弃通过MINGW64/GCC 4.7.1使用boost::thread(必须构建-m32,因为Irrlicht无法构建64位),因为这个问题,我猜是(有些定义指示64位MINGW在-m32时仍然为真,并触发变通方法宏以修复失败的_Interlocked和friends。我甚至尝试在我的一个.cpp文件中为失败的_itnerlock*函数创建存根,但仍然无法通过链接器。有些情况下,这还没有得到修复。)(例如:在使用minGW/GCC 4.7.1时为-m32),因此有人知道如何创建一个解决方案将是一个有用的答案。InterlocatedCompareExchange未定义错误在boost版本1.55.0中得到修复。