gpt4 book ai didi

c++ - 为什么 g++ 仍然需要 -latomic

转载 作者:可可西里 更新时间:2023-11-01 15:22:59 27 4
gpt4 key购买 nike

在 C++ 标准 2014 年 11 月工作草案的29.5 原子类型中,它指出:

  1. 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 仍然是必要的,或者这只是编译器维护者尚未解决的问题?

最佳答案

Relevant reading在 GCC 主页上关于 GCC 如何以及为什么在某些情况下调用库调用关于 <atomic>首先。

GCC 和 libstdc++ 只是松耦合。 libatomic是库的域,而不是编译器——并且您可以将 GCC 与不同的库一起使用(它可能会在其主体中或以不同的名称为 <atomic> 提供必要的定义),因此 GCC 不能只是 假设 -latomic .

Also :

GCC 4.7 does not include a library implementation as the API has not been firmly established.

同一页声称 GCC 4.8 将提供这样的库实现,但计划是 war 的第一个受害者。我猜是 -latomic 的原因仍然有必要可以在附近找到。

此外...

...so far I thought that any standard conformant, single file code can be compiled via the first command.

... -lm如果您使用的是数学函数,则已经存在了很长一段时间。

关于c++ - 为什么 g++ 仍然需要 -latomic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30591313/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com