在mingw64上使用boost.thread未定义引用InterlockedCompareExchange(但不在mingw32上)

时间:2013-08-08 19:09:49

标签: c++ linker mingw boost-thread mingw-w64

我在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 :(文本$ _ZN5boost12shared_mutex28interlocked_compare_exchangeINS0_10state_dataEEET_PS3_S3_S3 _ [_ _ ZN5boost12shared_mutex28interlocked_compare_exchangeINS0_10state_dataEEET_PS3_S3_S3] +值为0x2F):   未定义的引用`InterlockedCompareExchange'colore2:错误:   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_thread-mt -lboost_system

我的问题是:我做错了什么或是mingw64中的错误?它是用windows版的mingw编译的吗?

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

3 个答案:

答案 0 :(得分:3)

根据此页面http://sourceforge.net/apps/trac/mingw-w64/wiki/Building%20Boost,您可以添加define = BOOST_USE_WINDOWS_H以避免链接错误。它对我有用。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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