2014-12-09 10 views
6

Próbuję użyć GCC 4.9.2, aby skompilować kompilację aplikacji z Linuksa (x86_64-pc-linux-gnu) dla Windows (x86_64-w64-mingw32).Niezdefiniowany krzyż odniesienia kompilujący biblioteki statyczne z LTO pod GCC

Podczas budowania obiektów, które łączą się z bibliotekami statycznymi, a także przy użyciu optymalizacji czasu łącza, uzyskuję nieokreślone błędy odniesienia z łącznika dla wszystkich symboli, których obiekt docelowy używa z biblioteki.

np budowania bar.a z bar.cpp

int bar (void) {return 42;} 

i powiązanie z foo.cpp

extern int bar (void); 
int main (int, char**) {bar();} 

pomocą wiersza polecenia

x86_64-w64-mingw32-g++ -flto -o foo.o -c foo.cpp 
x86_64-w64-mingw32-g++ -flto -o bar.o -c bar.cpp 
x86_64-w64-mingw32-gcc-ar rc bar.a bar.o 
x86_64-w64-mingw32-gcc-ranlib bar.a 
x86_64-w64-mingw32-g++ -flto -fuse-linker-plugin foo.o bar.a -o foo 

wyniki w błędzie

/tmp/ccc3Twsc.lto.o:foo.o:(.text+0x15): undefined reference to `bar()' 
collect2: error: ld returned 1 exit status 

z góry:

  • Używam gcc-owijarki do AR/ranlib
  • nie ma żadnych zależności zewnętrzne
  • wszystkie pliki zostały skompilowane z tych samych opcji

mam próbowałem używać różnych kombinacji wtyczki-fuse-linker, gcc-ar vs ar, opcje widoczności symbolu, optymalizacje, itp., ale nie mogę go poprawnie połączyć bez wyłączania LTO.

Wszystkie obiekty docelowe zbudowane poprawnie pod macierzystym kompilatorem (system Linux x86_64).

Czy jest coś oczywistego, czego tu brakuje?

Odpowiedz

1

Jestem w stanie odtworzyć ten problem z łączeniem w Mingw32-gcc 4.9.2 pod Win7 64-bit. Jednak udało mi się połączyć, dodając -ffat-lto-objects jako obejście:

g++ -flto -o foo.o -c foo.cpp 
g++ -flto -ffat-lto-objects -o bar.o -c bar.cpp 
ar rc bar.a bar.o 
g++ -flto -o foo.exe foo.o bar.a 
+4

Dzięki za potwierdzenie. Niestety -ff-lto-objects pozwala linkerowi na powrót do standardowej metody łączenia i mniej lub bardziej neguje LTO dla moich celów (używając wielu bibliotek wygody). – dcro

+3

Należy również zauważyć, że 'gcc-ar' (w przeciwieństwie do' ar') będzie prawdopodobnie wymagało potwierdzenia, ponieważ 'ar' nie rozumie sekcji obiektów LTO/GIMPLE. 'gcc- {ar, ranlib, nm}' są tymczasowymi owijkami, które zachowują/rozumieją odpowiednie sekcje. – dcro

Powiązane problemy