2013-07-20 58 views
0

我在OS X上,我有一個.so文件,我想在執行過程中鏈接到一個.o文件。例如,在調用./Bar.o期間,Foo.so應該鏈接到Bar.o。我正在使用終端應用程序來運行我的應用程序,並使用Makefile編譯我的項目。如何在執行時將動態庫鏈接到構建?

+0

通常你只是-l標誌,例如編譯'g ++ Bar.cpp -l Foo.so -o Bar.o'。這不行嗎?爲什麼你需要將Foo.so鏈接起來?如果你可以發佈你的Makefile,這將有幫助... – maditya

+0

我已經被建議這種方法。事情是,我的Makefile已經使用cmake生成,並且該項目非常大。根據我目前對Makefiles和cmake的瞭解,我無法找到鏈接發生的確切位置。 – shaveenk

+0

有沒有辦法在運行時鏈接? – shaveenk

回答

0

在Unix和OS X上,你可以用libdl來做到這一點。

其基本思想是編譯並鏈接可執行文件。在某些可能不同的時間和地點,可能不是你的人編譯和鏈接共享庫。如果在運行時,可執行文件可以獲得共享庫文件名的字符串以及要加載的函數的符號,則可以使用libdl來獲取包含共享庫中函數地址的void *。在編譯時必須知道適當的函數指針類型,因爲下一步是將void *轉換爲可執行文件與動態加載的lib之間「暗中預先安排的」類型。鑄造後,你很好去。

本教程演示了動態加載函數的傳統方法。類需要通過工廠函數進行間接尋址。上述

http://www.tldp.org/HOWTO/html_single/C++-dlopen/

的方法是從哪裏開始,但它的缺點是可執行文件和lib之間的所有通信都必須通過功能之前,爲extern「C」創建C風格的函數簽名(最顯著沒有模板或過載)。這只是可執行文件和lib之間通信端口的限制。兩者都可以在內部使用C++。如果你想動態地導入重載函數,這是一種方法。

Dynamic Loading Without extern "C"

你必須要小心使用用戶定義的類。類的二進制表示在C++中沒有標準化。如果一個自定義類從可執行文件傳遞給lib,但是可執行文件和lib對於哪些位意味着什麼有不同的想法,那麼你不會得到你想要的行爲。另外,如果你在OS X上編譯你的共享庫,你有一個dylib,而不是如此。他們有些不同。

What are the differences between .so and .dylib on osx?

相關問題