2012-07-14 63 views
1

我:運行時共享庫​​可以調用現有符號嗎?

  • 應用一個
  • 動態庫d
  • 靜態庫小號

其中:

  • A在編譯時與靜態庫S鏈接。
  • D編譯時不鏈接S,但使用其頭文件
  • A使用dlopen在運行時加載D.

當在A中運行時D有可能使用S中定義的符號,而D在它自己的編譯時沒有與S鏈接?即D可以訪問全局命名空間中的符號嗎?

其他說明: 我需要d和A既能夠從S. 調用函數我非常不想改變S.

我試過這個,我也得到(當從S個碼元在d)中使用:

dyld: lazy symbol binding failed: Symbol not found: __Z14myFunctioni 

我相信這可能或者是:

  1. 現有函數 'myFunction的(int)的' 不是提供給共享庫(安全?)
  2. 此函數的符號名稱已被名稱以不同的方式(編輯:與extern "C"測試並排除)。

也許我需要用不同的設置進行編譯,或者我必須將所有的S鏈接到D?如果S本身變成一個動態圖書館,情況也會改變嗎?

三江源

+0

如果問題出在名稱混搭,請嘗試在myFunction的函數聲明中使用'extern「C''來禁用名稱混編。 – 2012-07-14 21:33:00

+0

謝謝Radek,我現在用你的建議排除了這一點。它必須是符號可訪問性問題。 – 2012-07-15 14:55:59

回答

2

庫中的外部引用使用該庫的依賴列表中的庫和以前與RTLD_GLOBAL標誌打開任何其他圖書館解決。 如果可執行文件與標誌「-rdynamic」(或同義詞「--export-dynamic」)鏈接,則可執行文件中的全局符號也將用於解析動態加載的庫中的引用。

+0

好的,這解決了它!謝謝!但是我現在已經揭示了下一個問題:應用程序中以前未使用的符號不包含在鏈接階段。有免費的旗幟嗎? - 整體檔案似乎是前進的方向,但還沒有成功。 – 2012-07-15 16:18:33

相關問題