In 29,5 Atomtypen der C++ Standard-November 2014 Arbeitsentwurf heißt es:Warum g ++ benötigen noch -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 ]
So - soweit ich das beurteilen kann - dies:
#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();
}
sollte perfekt gültige Standard-C++ 14 (und auch C++ 11) -Code sein. Allerdings, wenn ich nicht libatomic
manuell verknüpfen, den Befehl
g++ -std=c++14 <filename>
gibt - zumindest auf Fedora 22 (gcc 5.1) - die folgenden Verknüpfungsfehler:
/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
Wenn ich schreibe
g++ -std=c++14 -latomic <filename>
alles ist in Ordnung. Ich weiß, dass der Standard nichts über Compiler-Flags oder Bibliotheken sagt, die enthalten sein müssen, aber bisher dachte ich, dass jeder standardkonforme einzelne Dateicode über den ersten Befehl kompiliert werden kann.
Warum gilt das nicht für meinen Beispielcode? Gibt es einen rationalen Grund, warum -latomic
noch notwendig ist, oder ist es nur etwas, das noch nicht von den Compiler-Betreuern angesprochen wurde?
Beachten Sie, dass der C++ - Standard etwas mehrdeutig ist, ob die Bibliothek eine separate Komponente ist - die Bibliotheksabschnitte sind ziemlich eigenständig, aber "die Implementierung" in Standard bedeutet die Kombination von Compiler und Bibliothek. – MSalters
Korrigieren Sie mich, wenn ich falsch liege, aber gcc DOES - standardmäßig - ein paar Bibliotheken, so wie würde eine Standard-'latomic 'anders sein? – MikeMB
@MSalters: Ja, aber im Fall von GCC bedeutet "die Implementierung" "GCC und einige kompatible Standard-Bibliothek". Darauf wollte ich hinweisen - eine noch nicht abgeschlossene API zwischen dem Compiler und * einer * seiner (n) Standardbibliotheken, und Sie erhalten ein separates "-latomisches" von den Compilerleuten, die es nicht dachten alles, was problematisch ist, ein '-lm' für Math-Code zu erfordern. Keine große Sache, rundherum. – DevSolar