2011-03-11 32 views
10

Sadece gcc tanımlanmamış sembollerde sorun gidermek için etkili bir teknik olup olmadığını merak ediyorum. Bazen projelerimden biri bağlantı kuramaz ve genellikle nedenini bulmak için çok zaman harcıyorum. Genellikle, derin gizlenmiş bir makefile, yanlış ortam değişkeni ya da bunun gibi bir yazım hatasıdır. Yapımınız aniden "tanımlanmamış sembol" ile ölürse ve neden belli değil ise hangi yöntemi kullanıyorsunuz?Tanımlanmamış semboller için genel sorun giderme tekniği - gcc

+0

"Symbol" kelimesinin sözlüğüne bakıyorum ... (üzgünüm, geç oldu ...) – dappawit

cevap

23

Bunu başlangıç ​​yapılandırma olduğunu düşünün:

/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
bar.o: In function `baz()': 
bar.cpp:(.text+0xd): undefined reference to `Foo::bar()' 
collect2: ld returned 1 exit status 

tüm .o ve .lib dosyalara grep ile eksik sembolü ararken ile başlar. sembol orada eksik ve uygulanması halinde

$ grep 'Foo.*bar' *.o *.lib *.so 
Binary file bar.o matches 
Binary file foo.o matches 

Sonra her nesne dosyayı incelemesi nm Aracı inci kullanın.

$ nm foo.o 
00000000 T _ZN3Foo3barEv 

$ nm bar.o 
00000000 T _Z3bazv 
     U _ZN3Foo3barEv 
     U __gxx_personality_v0 

Şimdi Foo :: bar() foo.o uygulanan ve yürütülebilir içine bu dosyayı bağlayabilirsiniz biliyoruz. Bir sonraki bölüm, foo.o'nun neden link komutuna dahil olmadığını incelemektir.

Bazen herhangi bir uygulama sembolü bulamazsınız. Uygulama birimi oluşturulmadığında veya sembolü (#ifdef, sembol görünürlüğü) içermediğinde bu genellikle geçerlidir. Böyle bir durumda, sembolün tanımlandığı .cpp dosyasını ararım, dosyayı oluşturmak için make $file.o'u çalıştırın ve dosyayı daha sonra inceleyin. Smbol orada olduğunda, bu dosyanın yerleştirildiği kitaplığı veya yürütülebilir dosyayı oluşturmaya devam ediyorum.

+0

Bilgileriniz için teşekkür ederiz. Ayrıca linker tarafından bilinen kütüphaneleri dökmek için -Wl-t seçeneği eklemek de yararlıdır. Gerçekten zor vakalar için bir şey biliyor musun? Örneğin iki bağımlı statik kütüphane yanlış sırada yer aldı mı? – danatel

+0

@danatel Üzgünüm, fakat her durumda farklı olduğu için yanlış kütüphane bağımlılıklarını ayıklamak için genel bir tekniğim yok. – Rudi

+0

Bu harika bir cevap. Neden kabul edilmediğini merak ediyorum. –

İlgili konular