2012-12-02 62 views
2

我只有一個有關Linux共享庫文件的問題。動態共享庫 - 對於linux

我看了很多相關的動態共享庫的Linux操作系統 http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

在這裏,它被提及上面的鏈接--- 包括庫文件鏈接:ctest.h現在

LINUX在構建函數中使用libdl --- dlopen,dlsym,dlclose。
我們真的需要包含動態lybrary的原型文件 - ctest.h嗎?

請給與以上帖子有關的建議。

回答

1

您並不需要包含動態庫的頭文件或原型文件,但是您至少需要dlsym返回的值的特定類型信息。對於不包含動態庫的包含文件的示例,請參見herehere

在你發佈的例子中,他們的庫函數沒有頭文件/函數原型,並且提供了有關如何避免C++名稱變形的說明,這就是爲什麼他們在這種情況下包含頭文件的原因。

如果您定義自己的函數庫沒有函數原型,無論是源文件還是頭文件,那麼在使用dlsym時需要包含頭文件,否則不需要包含動態庫的頭文件因爲它的函數原型已經包含在生成的共享對象中。

包含在頭文件中的函數原型使得實現的函數可以由鏈接器按名稱解析。作爲共享對象文件,無論鏈接如何,都包含鏈接器鏈接到的庫的實現。

簡單的解釋是,#include包含的頭文件由預處理器處理,這意味着傳遞給鏈接器的結果源文件/文件知道每個函數調用是誰,因爲它查找函數調用原型在包含文件中,並且已包含在修改後的源代碼中。包含文件告訴鏈接器關於誰的函數調用是

對象文件,共享對象文件和其他庫文件告訴鏈接器有關什麼函數調用原型的實現。

要在註釋中回答您的問題,只需將libdl.so路徑添加到LD_LIBRARY_PATH或/etc/ld.so.conf並運行ldconfig,如果該庫或其相關的符號鏈接層次結構不在標準位置,如/usr/lib//lib/

有關更多信息,請參閱以下相關StackOverflow answer答案。

的更多信息可以在

+0

感謝appleman1234找到。只需使用另一件事---構建函數中的libdl --- dlopen,dlsym,dlclose。 -----我們是否需要爲加載器添加以下路徑... LD_LIBRARY_PATH或ldconfig? – user1870619