我在OS X上,我有一個.so文件,我想在執行過程中鏈接到一個.o文件。例如,在調用./Bar.o期間,Foo.so應該鏈接到Bar.o。我正在使用終端應用程序來運行我的應用程序,並使用Makefile編譯我的項目。如何在執行時將動態庫鏈接到構建?
0
A
回答
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,而不是如此。他們有些不同。
相關問題
- 1. 動態庫在執行時鏈接
- 2. 鏈接到靜態庫來構建靜態可執行
- 3. 可執行文件在構建後是否可以鏈接到動態庫?
- 4. 如何正確鏈接和構建動態鏈接庫?
- 5. 如何創建自動鏈接到動態庫的靜態庫?
- 6. 在構建期間將靜態庫鏈接到共享庫?
- 7. 執行動態創建SCRIPT SRC鏈接
- 8. UNIX:將可執行文件鏈接到靜態庫和動態庫?
- 9. 如何將靜態庫鏈接到gcc的動態庫中
- 10. 將動態庫鏈接到一個靜態庫(又名預鏈接動態庫)
- 11. 將動態庫鏈接到鏈接到其他靜態庫的靜態庫
- 12. 在可執行文件中找不到C++動態鏈接庫
- 13. 使用動態templateUrl在運行時構建的鏈接
- 14. VS2015如何將靜態庫鏈接到其他庫和可執行文件?
- 15. 如何鏈接到動態提升庫?
- 16. CMake - 僅在需要時將庫鏈接到可執行文件
- 17. 鏈接/構建白話/行話 - 動態鏈接方法
- 18. 如何使用Android構建靜態庫鏈接到第三方靜態庫ndk
- 19. 將GitLab構建狀態鏈接到Jenkins構建作業
- 20. 將Access數據庫鏈接到Sql構建和構建VB InterFace
- 21. 將多個C庫鏈接到C創建可執行文件
- 22. 如何將庫鏈接到cmake中的可執行文件?
- 23. Qt鏈接靜態構建庫
- 24. 如何將外部庫靜態鏈接到我的可執行文件中?
- 25. GNU Automake - 根據其相關性構建靜態鏈接的動態鏈接庫
- 26. Netbeans/C++:鏈接2項目在一起(可執行/動態庫)
- 27. 在構建時將一個庫動態鏈接到另一個庫,然後靜態鏈接到iphone應用程序
- 28. 無法動態構建鏈接標記
- 29. 動態鏈接庫
- 30. 靜態鏈接到動態庫。 glibc
通常你只是-l標誌,例如編譯'g ++ Bar.cpp -l Foo.so -o Bar.o'。這不行嗎?爲什麼你需要將Foo.so鏈接起來?如果你可以發佈你的Makefile,這將有幫助... – maditya
我已經被建議這種方法。事情是,我的Makefile已經使用cmake生成,並且該項目非常大。根據我目前對Makefiles和cmake的瞭解,我無法找到鏈接發生的確切位置。 – shaveenk
有沒有辦法在運行時鏈接? – shaveenk