在29.5原子类型的C++标准2014年11月工作草案它指出:为什么G ++仍然需要-latomic
- There is a generic class template atomic. The type of the template argument T shall be trivially copyable (3.9). [ Note: Type arguments that are not also statically initializable may be difficult to use. —end note ]
所以 - 据我可以告诉 - 这一点:
#include <atomic>
struct Message {
unsigned long int a;
unsigned long int b;
};
std::atomic<Message> sharedState;
int main() {
Message tmp{1,2};
sharedState.store(tmp);
Message tmp2=sharedState.load();
}
应该是完全有效的标准C++ 14(以及C++ 11)代码。但是,如果我不手动链接libatomic
,命令
g++ -std=c++14 <filename>
给 - 至少在Fedora 22(GCC 5.1) - 以下链接错误:
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::store(Message, std::memory_order)':
main.cpp:(.text._ZNSt6atomicI7MessageE5storeES0_St12memory_order[_ZNSt6atomicI7MessageE5storeES0_St12memory_order]+0x3f): undefined reference to `__atomic_store_16'
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::load(std::memory_order) const':
main.cpp:(.text._ZNKSt6atomicI7MessageE4loadESt12memory_order[_ZNKSt6atomicI7MessageE4loadESt12memory_order]+0x1c): undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 exit status
如果我写
g++ -std=c++14 -latomic <filename>
一切都很好。 我知道这个标准没有提到任何关于必须包含的编译器标志或库的内容,但到目前为止,我认为任何标准的一致性单一文件代码都可以通过第一个命令编译。
那么为什么不适用于我的示例代码呢?为什么-latomic
仍然是必需的,还是仅仅是编译器维护人员尚未解决的问题?
请注意,C++标准在库是否是一个单独的组件方面有些模棱两可 - 库部分是相当独立的,但标准中的“实现”意味着编译器和库的组合。 – MSalters
纠正我,如果我错了,但海湾合作委员会 - 默认情况下 - 包括几个库,那么默认的'-latomic'将如何不同? – MikeMB
@ MSalters:是的,但在GCC的情况下,“执行”是指“GCC和一些兼容的标准库”。这就是我想要指出的 - 编译器和它的(n)个标准库之间尚未最终确定的API,并且你从编译器的人那里获得了一个单独的'-latomic',它们并不认为它所有这些问题都需要'-lm'作为数学代码。没有什么大不了的。 – DevSolar