2014-09-16 5 views
13

Wenn ich versuche, mit -flto statischen Bibliotheken zu bauen, bekomme ich Fehler undefined reference:Wie kann ich lto mit statischen Bibliotheken verwenden?

library.cpp:

#include <iostream> 

void foo() { 
    std::cout << "Test!" << std::endl; 
} 

main.cpp:

void foo(); 

int main() { 
    foo(); 
    return 0; 
} 

Compilation Ausgabe:

$ g++ -flto -c library.cpp 
$ ar rcs library.a library.o 
$ g++ -flto main.cpp library.a 
/tmp/ccZIgxCY.ltrans0.ltrans.o: In function `main': 
ccZIgxCY.ltrans0.o:(.text+0x5): undefined reference to `foo()' 
collect2: error: ld returned 1 exit status 

Es funktioniert gut, wenn ich mit library.o statt library.a verknüpfen. Was vermisse ich? Dies ist mit GCC 4.9.1 und binutils 2.24.

+0

Haben Sie 'g ++ -flto -lary main.cpp' versucht? –

+0

@ πάνταῥεῖ Auch gebrochen. Aber ich fand die Antwort, als ich die Frage schrieb, sie steht unten. –

Antwort

19

Die Antwort, wie ich aus this Beitrag von GCC Entwickler Honza Hubička herausgefunden, ist die gcc-ar Wrapper statt ar für sich zu nutzen:

$ gcc-ar rcs library.a library.o 

Das ruft ar mit den richtigen Plugin Argumente in meinem Fall waren

--plugin /usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.1/liblto_plugin.so 
+6

Es ist erwähnenswert, dass es auch 'gcc-ranolib' und' gcc-nm' gibt, wenn Sie sie brauchen. – rodrigo

+0

@rodrigo In der Tat - es scheint, dass "Ar" nur ein Teil des Bildes ist. Ich musste auch mit 'gcc-ralib' überschreiben, da der Systemstandard nicht mit den LTO-Objekten umgehen konnte. Also, da es schwierig scheint, etwas zu finden, das sich einer One-Liner-Lösung nähert: Ich habe LTO wie folgt arbeiten lassen: './configure --prefix =/opt/testmake AR = gcc-ar RANLIB = gcc-ralib CXXFLAGS = ' -O3 -flto'' –

+0

@underscore_d Wie 'man ranlib' angibt, ist es äquivalent zu' ar s'. Ich erstelle alle meine statischen Bibliotheken mit 'gcc-ar rcs', nur einen Schritt. –

Verwandte Themen