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
cevap
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.
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
@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
Bu harika bir cevap. Neden kabul edilmediğini merak ediyorum. –
- 1. gcc 4.8 atıyor "mimarisi için tanımlanmamış semboller x86_64:"
- 2. tanımlanmamış başvuru çapraz GCC
- 3. Mimari armv7 için tanımlanmamış semboller: "_OBJC_CLASS _ $ _ FIRApp"
- 4. Sorun Giderme Çift İşaretçi
- 5. Sorun giderme matplotlib animasyonu
- 6. JBoss üzerinde sorun giderme
- 7. QT-yaratıcısı için x86_64 mimarisi için tanımlanmamış semboller
- 8. Ubuntu'da python3 için sorun giderme yüklüyor 14.04
- 9. Makefile hedefleri sorun giderme için nasıl izlenir?
- 10. Sorun Giderme PIP Yükle Windows
- 11. GTK ile sorun giderme sorunları
- 12. Sorun Giderme CentOS'ta Git Yüklenmesi
- 13. Sorun giderme yii cron job
- 14. SORUN GİDERME ve SIFIRLA hata
- 15. Android Studio'daki sorunlar sorun giderme
- 16. Bir .C dosyası derleniyor: Mimari için tanımlanmamış semboller x86_64
- 17. Neden gcc, hata ayıklamayan yapıya semboller ekliyor?
- 18. Mimarisi için tanımlanmamış semboller x86_64 Mac Lion üzerinde ImageMagick
- 19. Dağıtım hedefi olduğunda mimarlık hatası için tanımlanmamış semboller 7.0
- 20. Mimarisi için tanımlanmamış semboller i386: "_sqlite3_open", başvurulan: hata
- 21. Genel ve özel anahtar şifreleme tekniği C# içinde kullanmak için #
- 22. Scala + Slick + MySQL + Akka + Aktarımı Kullanırken Karşılaşılan Sorun Sorun Giderme
- 23. Sorun Giderme Raylar 3 MySQL ile çalışmak
- 24. Unitofwork Kullanıcı Deposu ile Sorun Giderme Lambda
- 25. Temel swift/spritekit oyunu - sorun giderme
- 26. Google Analytics Etkinlik İzleme Sorun Giderme
- 27. Sorun Giderme C Programlamada Printf Yazdırma
- 28. IIS 8.5'de sondaki sorun giderme sorunu
- 29. Sorun Giderme python'u crontab'dan - "geçersiz Python yüklemesi"
- 30. ReaderWriterLockSLim ile sorun giderme ReaderWriterLockSLim - sorunları
"Symbol" kelimesinin sözlüğüne bakıyorum ... (üzgünüm, geç oldu ...) – dappawit