TL; DR :
我有一个使用boost的asio库的程序。在Win10上使用MSVC ++(VS2015 Update 3)和在Ubuntu 14.04上使用g ++ 4.8进行编译时,它可以完美运行,但是我也想使用随新版Visual Studio一起提供的clang前端(我相信自更新以来) 1)。
我的初始命令行选项(从项目属性页面复制)如下所示:
-fpic" stdafx.h" -std = c ++ 1y -fstack-protector" Clang \" -fno-strict-aliasing -ffunction-sections -g2 -gdwarf-2 -O0 -x c ++ - header -D" _WINSOCK_DEPRECATED_NO_WARNINGS" -D" NOMINMAX" -frtti -fomit-frame-pointer -fdata-sections -fno-ms-compatibility -std = c11 -fexceptions -o" Clang \%(filename).obj" -fms-extensions -fno-short-enums
这给了我以下错误:
void __cdecl boost::detail::atomic_increment(struct __clang::_Atomic<int> *)': Unexpected atomic instruction -- use Windows interlock intrinsics
显然,使用clang / c2版本不支持的clang / gcc内在函数而不是使用在使用VC ++编译时使用的特定于Windows的内在函数时,会增加疲劳。我玩了不同的编译器选项,唯一似乎有效的是取消定义__clang__
预处理器符号(在命令行中添加以下选项):
-U "__clang__"
摆脱了原子错误,但现在我得到多页错误消息似乎与某些boost mpl宏有关。以下是前几行:
1> In file included from main.cpp:1:
1> In file included from D:\mylibs\boost\include\boost/program_options.hpp:15:
1> In file included from D:\mylibs\boost\include\boost/program_options/options_description.hpp:13:
1> In file included from D:\mylibs\boost\include\boost/program_options/value_semantic.hpp:12:
1> In file included from D:\mylibs\boost\include\boost/any.hpp:20:
1> In file included from D:\mylibs\boost\include\boost/type_index.hpp:29:
1> In file included from D:\mylibs\boost\include\boost/type_index/stl_type_index.hpp:40:
1>D:\mylibs\boost\include\boost/mpl/if.hpp(131,23): error : too many arguments provided to function-like macro invocation
1> BOOST_MPL_AUX_NA_SPEC(3, if_)
1> ^
1> D:\mylibs\boost\include\boost/preprocessor/facilities/expand.hpp(26,10) : note: macro 'BOOST_PP_EXPAND_I' defined here
1> # define BOOST_PP_EXPAND_I(x) x
1> ^
有人有解决方案吗?
请注意,我的问题不是像本文中那样构建boost库:Command parameters for b2 in order to build Boost libraries with Microsoft's Clang/C2。是的,我知道来自boost的clang / c2没有官方支持,但我想知道是否有人知道会产生正确的boost配置宏的hack。
答案 0 :(得分:5)
使用 Clang / C2 清晰地编译提升标题对于使 Clang / C2 有用至关重要,因此我们正在努力支持Clang-style
原子内在函数。它们将在 Clang / C2 的未来更新中提供。
我还没有意识到说服提升使用 MSVC 版本的内在函数同时仍使用 Clang 进行编译的方法,除非你愿意破解Boost标题。
答案 1 :(得分:1)
尝试在编译器选项中定义宏BOOST_SP_USE_STD_ATOMIC
,或在#include
任何Boost标头之前定义。