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?
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
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