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çindex86_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ı?
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
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