2015-12-16 10 views
6

Programımı derlemeye çalıştığımda çözülmeyen bir sembol hatası var, bu da __dso_handle'u bulamadığından şikayet ediyor. Bu işlev genellikle hangi kütüphanede tanımlanmaktadır?__dso_handle nerede tanımlandı?

Aşağıdaki sonuç, nm on libstdc++.so.6'dan itibaren şunu içerir?

Buna karşı bağlantı kurmaya çalıştım ancak hata hala oluşuyor.

nm libstdc++.so.6 | grep dso 
00000000002fc480 d __dso_handle 

cevap

8

__dso_handleused to identify dynamic shared objects during global destruction bir "bekçi" dir.

Gerçekçi olarak, burada okumayı kesmelisiniz. Nesne tanımlamasını __dso_handle ile uğraşarak yenmeye çalışıyorsanız, büyük olasılıkla bir şey yanlıştır. Ancak, nerede tanımlandığını sorduğunuz için, yanıt karmaşıktır. Tanımının yerini (GCC için) ölçmek için, C++ dosyasında iostream kullanın ve bundan sonra extern int __dso_handle; yapın. Bu, tür çatışmaya bağlı olarak beyanın yerini işaret etmelidir (kaynak için bkz. this forum thread).

Bazen, defined manually.

Bazen, derleyici tarafından yüklenen "çalışma zamanı" tarafından tanımlanır/sağlanır (uygulamada, CRT genellikle bir grup ikili başlık/giriş noktası yönetimi kodu ve bazı çıkış bekçileri/işleyicileridir). GCC ise (emin değilim diğer derleyiciler bunu destekleyecek eğer; eğer öyleyse, onların kaynaklarda olacağım):

Genellikle bunun tanımlanır stdlib:

fazla okuma:

0

bu sorunla karşılaştık.

  1. g ++ C/C++ standart kitaplığı olmayan bağlama: -nostdlib (tipik küçük yerleşimli senaryosu) burada güvenilir sorun oluşturmak için gibi durumlardır.
  2. Statik olarak ayrılmış bir standart kitaplık nesnesinin tanımlanması; Benim durumuma özgü std::vector. Önceden bu herhangi bir sorun olmadan statik olarak ayrılmış std::array oldu. Görünüşe göre, statik olarak ayrılmış nesnelerin tümü std:: soruna neden olmaz.
  3. Hiçbir türde bir paylaşılan kitaplık kullanmadığımı unutmayın.
  4. kullanımdadır.

bu sadece sizin derleme/link komut satırına komut satırı seçeneği eklemek sonra kullanım durumda: -fno-use-cxa-atexit

İşte __dso_handle usage as 'handle to dynamic shared object' için çok iyi bir bağlantıdır.

sayfasında bir yazım hatası olduğu görülmektedir, ancak onaylamak için irtibata hiçbir fikrim yok: Eğer nesnelerin yapıcı yıkıcı çağrıda GCC otomatik işlevini çağırır sonra

...

Ben belirtildiği gibi bu onaylamak için

tek yön __cxa_atexit işlevi uygulamak olacaktır ... "her yıkıcılar GCC işlevini çağırır denilen edildikten sonra" bu okumalısınız düşünmek ve daha sonra tek adım programı ve onu nerede olduğunu görmek aranır. Şu günlerden birini deneyeceğim ama şu an değil.