2013-01-31 23 views
5

我試圖動態加載相機庫.so文件到Linux可執行文件以獲取對簡單相機功能的訪問。使用dlopen()訪問.so庫拋出未定義的符號錯誤

我試圖通過這樣做:

if ((newHandle = dlopen("./libCamera.so",RTLD_LAZY | RTLD_GLOBAL)) == NULL) 
    { 
    printf("Could not open file : %s\n", dlerror()); 
    return 1; 
    } 

但是這個失敗,我收到以下輸出: 「無法打開文件:libCamera.so:未定義的符號:ZTVN10 _cxxabiv117__class_type_infoE」

如何找出它所依賴的符號?

回答

10

最有可能的,libCamera.so使用在一個共享庫中定義的符號而不上該庫取決於

  1. 找到一個罪魁禍首。採取一個真正的可執行文件鏈接到libCamera.so(和它的作品)。用ldd /path/to/executable列出它的依賴關係。其中應該是一個圖書館,其定義爲ZTVN10_cxxabiv117__class_type_infoE(使用grep來選擇可能的候選人,nm -D在圖書館肯定)。該庫不會位於ldd ./libCamera.so所示的列表中。

  2. 解決問題。首先將步驟1中找到的庫加載dlopen(還有,也使用RTLD_GLOBAL)。

  3. 如果存在與另一符號的問題,轉到步驟1

  4. 如果新添加的庫有同樣的問題太多,轉到步驟1

  5. 告訴庫作者取悅解決他們的鏈接。

它也可能發生在ldd ./libCamera.so的先決條件之一得到了升級,並失去了一個符號定義(也許是重新編譯了編譯器,做名字改編不同)。然後你將不會在步驟1中找到罪魁禍首,並且沒有解決辦法,只能再次降級

6

ldd命令可用於顯示共享庫依賴關係。

ldd libCamera.so 

一旦你知道的依賴,你可以使用nm來顯示每個庫的符號。

nm -DC libCamera.so 
+0

我看到'nm -DC libCamera.so'中列出的函數,但它仍然未定義。最後,事實證明,在.h文件中,其中一個參數是.cpp中的const&,它不是const,它導致它未定義。 –

1

在libCamera.so的源代碼中,您有無法解析的外部符號。這意味着type_infoE在源代碼中沒有定義,應該解決。

2

我有類似的問題。它與.a庫有關,該庫應該已鏈接到我的.so,並靜態鏈接到存檔被忽略。

nm mylibrary.so | grep ZTVN10_cxxabiv117__class_type_infoE 
0000ABC0 U ZTVN10_cxxabiv117__class_type_infoE 

U這裏means that符號是 「未定義」:

我與(這裏使用OP對象名)測定此。你可以用--demangle找到失蹤的對象demangled名稱:

$ nm --demangle mylibrary.so | grep 0000ABC0 
0000ABC0 U abi::class_type_info(params...) 

(或類似的東西),這應該幫助你找出缺少的庫。

就我而言,即使在編譯器行中包含庫之後,我仍然遇到了這個問題。最後,一些修修補補後,我發現庫文件(.a)具有落入其從屬對象(.o)後的文件,如:

g++ -Wl,-E -g -m32 ... -fPIC myobjects1.o myobjects2.o missing_library.a -shared -o mylibrary.so 

現在我得到(沒有更多U):

$ nm --demangle mylibrary.so | grep 0000ABC0 
0000ABC0 T abi::class_type_info(params...) 

,最重要的是我不會再犯錯誤了!

相關問題