(有关我正在使用的Boost和Clang特定版本的信息,请参阅问题末尾)
使用新的实验-fmodules功能在master / HEAD中编译Clang,使用如下所示的命令行选项编译以下文件时出现构建错误:
#include <iterator> #include <boost/move/iterator.hpp>
编译命令和错误:
anhall@leviathan: <path-to-clang-install-from-master>/bin/clang++ -o file.o -c file.cpp --std=c++1z -stdlib=libc++ -fmodules In file included from file.cpp:2: In file included from /usr/local/include/boost/move/iterator.hpp:27: /usr/local/include/boost/move/detail/iterator_traits.hpp:60:17: error: reference to 'random_access_iterator_tag' is ambiguous typedef std::random_access_iterator_tag iterator_category; ^ /Users/anhall/impersonal/code/llvm-reflexpr/install/bin/../include/c++/v1/iterator:438:30: note: candidate found by name lookup is 'std::__1::random_access_iterator_tag' struct _LIBCPP_TYPE_VIS_ONLY random_access_iterator_tag : public bidirectional_iterator_tag {}; ^ /usr/local/include/boost/move/detail/iterator_traits.hpp:34:8: note: candidate found by name lookup is 'std::random_access_iterator_tag' struct random_access_iterator_tag; ^ /usr/local/include/boost/move/detail/iterator_traits.hpp:71:17: error: reference to 'random_access_iterator_tag' is ambiguous typedef std::random_access_iterator_tag iterator_category; ^ /Users/anhall/impersonal/code/llvm-reflexpr/install/bin/../include/c++/v1/iterator:438:30: note: candidate found by name lookup is 'std::__1::random_access_iterator_tag' struct _LIBCPP_TYPE_VIS_ONLY random_access_iterator_tag : public bidirectional_iterator_tag {}; ^ /usr/local/include/boost/move/detail/iterator_traits.hpp:34:8: note: candidate found by name lookup is 'std::random_access_iterator_tag' struct random_access_iterator_tag; ^ In file included from file.cpp:2: /usr/local/include/boost/move/iterator.hpp:196:17: error: reference to 'output_iterator_tag' is ambiguous typedef std::output_iterator_tag iterator_category; ^ /Users/anhall/impersonal/code/llvm-reflexpr/install/bin/../include/c++/v1/iterator:435:30: note: candidate found by name lookup is 'std::__1::output_iterator_tag' struct _LIBCPP_TYPE_VIS_ONLY output_iterator_tag {}; ^ /usr/local/include/boost/move/detail/iterator_traits.hpp:35:8: note: candidate found by name lookup is 'std::output_iterator_tag' struct output_iterator_tag; ^ In file included from file.cpp:2: /usr/local/include/boost/move/iterator.hpp:238:17: error: reference to 'output_iterator_tag' is ambiguous typedef std::output_iterator_tag iterator_category; ^ /Users/anhall/impersonal/code/llvm-reflexpr/install/bin/../include/c++/v1/iterator:435:30: note: candidate found by name lookup is 'std::__1::output_iterator_tag' struct _LIBCPP_TYPE_VIS_ONLY output_iterator_tag {}; ^ /usr/local/include/boost/move/detail/iterator_traits.hpp:35:8: note: candidate found by name lookup is 'std::output_iterator_tag' struct output_iterator_tag; ^ In file included from file.cpp:2: /usr/local/include/boost/move/iterator.hpp:278:17: error: reference to 'output_iterator_tag' is ambiguous typedef std::output_iterator_tag iterator_category; ^ /Users/anhall/impersonal/code/llvm-reflexpr/install/bin/../include/c++/v1/iterator:435:30: note: candidate found by name lookup is 'std::__1::output_iterator_tag' struct _LIBCPP_TYPE_VIS_ONLY output_iterator_tag {}; ^ /usr/local/include/boost/move/detail/iterator_traits.hpp:35:8: note: candidate found by name lookup is 'std::output_iterator_tag' struct output_iterator_tag; ^ 5 errors generated.
如果我删除#include< iterator>或者在#include< boost / move / iterator.hpp>之后移动它,错误消失.
问题:这只是Boost库的副产品(Boost Move,特别是显然)没有为具有Clang模块映射文件的模块做好准备吗?这可能是Clang现在为libc实现的模块映射文件的错误,甚至是模块实现本身的错误?
有趣的是,我可以通过注释boost / move / detail / iterator_traits.hpp的第28-28行来消除错误:
// #include <boost/move/detail/std_ns_begin.hpp> // BOOST_MOVE_STD_NS_BEG // // struct input_iterator_tag; // struct forward_iterator_tag; // struct bidirectional_iterator_tag; // struct random_access_iterator_tag; // struct output_iterator_tag; // // BOOST_MOVE_STD_NS_END // #include <boost/move/detail/std_ns_end.hpp>
正在使用的版本
提升1.61
截至2016年12月7日,Clang来自LLVM的github镜像中的主分支的尖端(技术上它来自LLVM的分支,但它只在主分支上与LLVM自己的主分支相同):
clang version 4.0.0 (https://github.com/matus-chochlik/clang.git b9cb1c8a1ebf52695372de12c7b04c8ef1bd8b4e) (https://github.com/llvm-mirror/llvm.git b60c7b1f61eabbe971d08568adb790a7cfc6a403) Target: x86_64-apple-darwin15.6.0 Thread model: posix InstalledDir: /Users/anhall/impersonal/code/llvm-reflexpr/install/bin
解决方法
我相信这是由libc的module.modulemap问题引起的,我昨天在
r289028修复了这个问题.这个错误导致在启用模块时libc不会导出_LIBCPP_VERSION宏.
在查看boost / move / detail / iterator_traits.hpp后,似乎如果没有定义_LIBCPP_VERSION,它将错过配置并最终声明完全不同的迭代器标记定义. (具体来说,它将直接在命名空间std中定义它们,而不是在libc的版本控制命名空间中定义它们).
如果您重新构建LLVM和libc,它应该解决您的问题.如果没有自由到file a bug.
PS.看来我只是one step ahead.