使用clang 5.0.1 / 6.0.0编译成功,但是使用5.0.2 / 6.0.1编译失败

时间:2018-08-14 14:33:22

标签: c++ compiler-errors clang++ llvm-clang boost-interprocess

TL; DR:Clang 6.0.0编译我的程序; 6.0.1没有。回归?还是由于测试不完整?代码错误?

我最近将Boost Interprocess集成到了我正在构建的库中。在GCC上可以正常工作,但是在Clang中我得到的结果好坏参半。

+---------------------------+-----------+-------------------+-------------------+
|          System           | GCC 6/7/8 | Clang 6.0.0/5.0.1 | Clang 6.0.1/5.0.2 |
+---------------------------+-----------+-------------------+-------------------+
| Ubuntu 14.04 (Travis)     | Succeeds  | Not available     | Fails (see below) |
| Linux Mint 19 (my laptop) | Succeeds  | Succeeds          | (?)               |
+---------------------------+-----------+-------------------+-------------------+

在包含Boost Interprocess之前,使用clang进行编译会产生一些与GNU扩展有关的警告...

warning: token pasting of ',' and __VA_ARGS__ is a GNU extension
      [-Wgnu-zero-variadic-macro-arguments]
  L->debug(LFMT fmt, __FILENAME__, __LINE__, __FUNCTION__, ##__VA_ARGS__);

...以及宏扩展:

warning: extension used [-Wlanguage-extension-token]
  SET_WRAPPED(pthread_rwlock_init, pthread_handle);
  ^
/home/joaomlneto/Documents/GitHub/fpthreads/fpthreads/src/fpthread/util/wrap.cpp:14:16: note: expanded from macro 'SET_WRAPPED'
    WRAP(x) = (typeof(WRAP(x))) dlsym(handle, #x);\

但是编译成功。

在我开始使用Boost Interprocess之后,在unordered_map中实例化shared_memory_segment会导致clang 5.0.2 / 6.0.1(travis-ci的版本)上发生致命错误,但在版本上成功5.0.1 / 6.0.0(在Linux Mint 19中可用,这是Ubuntu 18.04的默认设置)。有问题的代码摘录(受https://stackoverflow.com/a/49738871/4288486启发)如下:

namespace ipc = boost::interprocess;
using Segment = ipc::managed_shared_memory;
using Manager = Segment::segment_manager;
template <typename T> using Alloc = ipc::allocator<T, Manager>;
template <typename K, typename V, typename KH = std::hash<K>,
          typename KEq = std::equal_to<K>>
using HashMap = std::unordered_map<K, V, KH, KEq, Alloc<void>>;
typedef HashMap<pid_t, Thread> ThreadMap;
Manager *thread_mgr = _segment.get_segment_manager();
_threads = _segment.find_or_construct<ThreadMap>("threads")(thread_mgr);

Full output from Travis

1 个答案:

答案 0 :(得分:0)

clang使用的是系统中捆绑的c ++库(我的理解是它不像g++那样捆绑在一起)。默认情况下,Ubuntu 14.04包含g++-4.9的{​​{1}},这已经过时了(我想)。

安装例如libstdc++解决了我的问题。