2014-12-09 30 views
6

altında LTO ile statik kitaplıkları derleme Linux (x86_64-pc-linux-gnu) (Windows için x86_64-w64-mingw32) bir uygulama derlemek için GCC 4.9.2 kullanmaya çalışıyorum.tanımlanmamış başvuru çapraz GCC

Statik kitaplıklara karşı bağlantı oluşturan ve aynı zamanda bağlantı zamanı optimizasyonu kullanan hedefler oluştururken, hedef kitaplıktan kullandığı tüm semboller için bağlayıcıdan tanımlanmamış referans hataları alıyorum.

örneğin bar.cpp

int bar (void) {return 42;} 

gelen bar.a yapı yanılma

içinde

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 

Sonuçlar komutu kullanılarak foo.cpp

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

ile bağlama

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

Yukarıdan:

  • Ben
  • tüm dosyalar aynı seçeneklerle derlenmektedir hiçbir dış bağımlılıkları vardır
  • ar/runlib için gcc-sarmalayıcılarını kullanıyorum

Ben -fuse-linker-plugin, gcc-ar vs ar, sembol görünürlüğü seçenekleri, optimsations vb. çeşitli kombinasyonlarını kullanmayı denedi ancak LTO'yu kapatmadan doğru şekilde bağlantı kuramıyorum.

Tüm hedefler yerel derleyici (x86_64 Linux) altında doğru şekilde oluşturulur.

Burada eksik olduğum belli bir şey var mı?

cevap

1

Bu bağlantı problemini, Win7 64-bit'in altında Mingw32-gcc 4.9.2 sürümünde oluşturabiliyorum. Ancak, bir geçici çözüm olarak -ffat-lto-objects ekleyerek başarılı bir şekilde bağlantı kurdu:

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

Onay için teşekkürler. Maalesef -efki-nesneleri, linker'ın standart bir bağlantı yöntemine ve LTO'nun benim için bir çok kolaylık kütüphanesi kullanarak geri adım atmasına izin veriyor. – dcro

+3

Ayrıca, gcc-ar'ın ('ar' yerine), 'ar' LTO/GIMPLE nesne bölümlerini anlamadığı konusunda onaylama zorunluluğu olduğunu unutmayın. gcc- {ar, ranlib, nm}, ilgili bölümleri koruyan/anlatan geçici ambalajlardır. – dcro

İlgili konular