在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