簡體   English   中英

Linux,Mono,共享庫和未解析的符號

[英]Linux, Mono, shared libs and unresolved symbols

我有一個填充程序庫(共享的C ++),它在另一個共享庫(libexif)中調用函數,並為C#提供了一個簡單的接口,用於Platform Invoke調用。 (也就是說,C#程序使用PInvoke調用我的自定義共享庫,而該庫又調用另一個共享庫。)

在Windows中,當我的自定義庫鏈接以及C#應用程序執行時,我的自定義共享庫鏈接到共享庫。

在Linux上,鏈接我的共享庫不會鏈接其他共享庫。 使用C ++驅動程序時,我在鏈接應用程序時指定了另一個庫,那時所有符號都已解析。 但是,當我嘗試從C#程序(使用mono編譯)調用共享庫時,其他共享庫中的符號無法解析。 我嘗試使用MONO_PATH變量指定其他庫,但似乎沒有什么不同。 我也嘗試過在DLLimport語句中指定未解析的函數,但這似乎無濟於事。

如何指定一個不被C#代碼直接調用的共享庫,以便mono / cli在運行時找到它?

我使用以下命令來構建共享庫:

g++ -fPIC -g -c -Wall  libexif-wrapper.cpp
g++ -shared -Wl,-soname,libexif-wrapper.so.1     -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc
ar rcs libexif-wrapper.a libexif-wrapper.so.1

和以下命令行來編譯我的C#驅動程序:

mcs -unsafe -define:LINUX Test-libexif-wrapper.cs

在執行時,我收到一個錯誤,提示找不到共享庫使用的符號:

/usr/bin/cli: symbol lookup error: ../../../C/libexif-wrapper/libexif-wrapper/libexif-wrapper.so.1: undefined symbol: exif_data_new_from_file

(libexif-wrapper是我的共享庫,它充當C#應用程序和libexif之間的墊片。)

我一直無法弄清楚如何解決這個問題。 任何建議,將不勝感激。

編輯:回答問題:

您確定可以在LD_LIBRARY_PATH環境變量中找到非托管的libexif-wrapper嗎?

實際上不是。 我已經在DLLImport中精心制作了直接指向它的路徑。 運行時找到它,因為它在上面的錯誤消息中報告了它的路徑。 此外,C#程序不會調用丟失的符號,而是共享庫中的函數之一調用了后來找不到的函數。 (謝謝-謝謝)

像這樣鏈接包裝器庫時,應指定依賴項

g++ -shared -Wl,-soname,libexif-wrapper.so.1 -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc -lexif

當您這樣做時,動態鏈接器就會知道libexif-wrapper依賴於libexif,並且它可以解析加載時的符號。

我對為什么需要-lc感到困惑,但這也許是單聲道的怪異...

如果將-lexif添加到鏈接命令,是否可以正常工作? 似乎您正在使用未定義的符號創建共享庫,但未說明這些符號應來自何處 有時這實際上很有用-例如,創建一個使用預期由加載它的應用程序已經提供的符號的插件-但不是您想要的; 我看不到libdl (或者Mono加載庫,也許它有自己的實現)如何知道需要加載libexif.so以便在您的庫中使用。

希望您不必做一些可怕的事情,例如將libexif.so添加到存檔中...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM