2015-06-02 10 views
10

In 29,5 Atomtypen der C++ Standard-November 2014 Arbeitsentwurf heißt es:Warum g ++ benötigen noch -latomic

  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 ]

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?

Antwort

4

Relevant reading auf der GCC-Homepage auf, wie und warum GCC Bibliotheksaufrufe in bestimmten Fällen bezüglich <atomic> an erster Stelle macht.

GCC und libstdC++ sind nur lose gekoppelt. libatomic ist die Domäne der Bibliothek, nicht der Compiler - und Sie können GCC mit einer anderen Bibliothek verwenden (die möglicherweise die erforderlichen Definitionen für <atomic> in seiner eigentlichen oder unter einem anderen Namen bereitstellen), so GCC kann nicht nur annehmen -latomic.

Also:

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

Die gleiche Seite behauptet, dass GCC 4.8 eine solche Bibliothek Implementierung zur Verfügung stellen soll, aber die Pläne sind die ersten Opfer des Krieges. Ich denke, der Grund für -latomic, der noch notwendig ist, kann in dieser Umgebung gefunden werden.

Neben ...

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

... -lm gibt es schon seit geraumer Zeit, wenn Sie mathematische Funktionen verwenden.

+2

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

+1

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

+0

@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

0

g++ ist ein Wrapper für gcc, der die richtigen C++ - Bibliotheken hinzufügt. Offensichtlich fehlt -latomic von dieser Liste. Kein Core-Compiler-Problem, sondern nur ein kleiner Fehler im Wrapper.

+0

Es könnte eine bewusste Entscheidung sein, da sie noch nicht vollständig implementiert ist. Insbesondere * 29.3 Unterstützung von Bestellung und Konsistenz * wird als Teil aufgeführt. https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2014 –

+4

'g ++' ist _nicht_ "ein Wrapper für' gcc' ". Sie sind eher wie Geschwister, die beide die verschiedenen tatsächlichen Compiler umhüllen (z.B. 'cc1plus'). –

1

I know that the standard doesn't say anything about compiler flags or libraries that have to be included

Rechts.

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

Nun, nein. Wie Sie nur sagten, gibt es keinen besonderen Grund, dies anzunehmen.Beachten Sie auch, dass GCC-Erweiterungen standardmäßig aktiviert sind.

Das besagt, es scheint selbstverständlich, dass die Absicht ist, -latomic einen Standard-Teil der Laufzeit zu machen, wenn es ein wenig beruhigt ist.

+0

Offensichtlich habe ich diese Annahme nicht basierend auf etwas gemacht, das im Standard geschrieben ist, sondern basierend auf meiner (etwas eingeschränkten) Erfahrung mit g ++. Korrigiere mich auch, wenn ich falsch liege, aber deaktiviert '-std = C++ 11' keine g ++ spezifischen Erweiterungen? – MikeMB

+0

@MikeMB: Oh, könnte es. –

Verwandte Themen