使用 clang 5.0.1/6.0.0 编译成功,使用 5.0.2/6.0.1 失败
Compilation successful with clang 5.0.1/6.0.0, fails with 5.0.2/6.0.1
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 后,在 shared_memory_segment
中实例化一个 unordered_map
会导致 clang 5.0.2/6.0.1(travis-ci 上的版本)出现致命错误),但在版本 5.0.1/6.0.0 上成功(在 linux mint 19 中可用,这是 ubuntu 18.04 的默认值)。有问题的代码摘录(受 启发)如下:
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);
clang
使用系统中捆绑的 c++ 库(我的理解是它不像 g++
那样捆绑提供?)。默认情况下,Ubuntu 14.04 包括 g++-4.9
的 libstdc++
,这是过时的(我猜)。
安装例如libstdc++-8-dev
解决了我的问题。
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 后,在 shared_memory_segment
中实例化一个 unordered_map
会导致 clang 5.0.2/6.0.1(travis-ci 上的版本)出现致命错误),但在版本 5.0.1/6.0.0 上成功(在 linux mint 19 中可用,这是 ubuntu 18.04 的默认值)。有问题的代码摘录(受
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);
clang
使用系统中捆绑的 c++ 库(我的理解是它不像 g++
那样捆绑提供?)。默认情况下,Ubuntu 14.04 包括 g++-4.9
的 libstdc++
,这是过时的(我猜)。
安装例如libstdc++-8-dev
解决了我的问题。