您並不需要包含動態庫的頭文件或原型文件,但是您至少需要dlsym
返回的值的特定類型信息。對於不包含動態庫的包含文件的示例,請參見here和here。
在你發佈的例子中,他們的庫函數沒有頭文件/函數原型,並且提供了有關如何避免C++名稱變形的說明,這就是爲什麼他們在這種情況下包含頭文件的原因。
如果您定義自己的函數庫沒有函數原型,無論是源文件還是頭文件,那麼在使用dlsym
時需要包含頭文件,否則不需要包含動態庫的頭文件因爲它的函數原型已經包含在生成的共享對象中。
包含在頭文件中的函數原型使得實現的函數可以由鏈接器按名稱解析。作爲共享對象文件,無論鏈接如何,都包含鏈接器鏈接到的庫的實現。
簡單的解釋是,#include
包含的頭文件由預處理器處理,這意味着傳遞給鏈接器的結果源文件/文件知道每個函數調用是誰,因爲它查找函數調用原型在包含文件中,並且已包含在修改後的源代碼中。包含文件告訴鏈接器關於誰的函數調用是。
對象文件,共享對象文件和其他庫文件告訴鏈接器有關什麼函數調用原型的實現。
要在註釋中回答您的問題,只需將libdl.so
路徑添加到LD_LIBRARY_PATH
或/etc/ld.so.conf並運行ldconfig,如果該庫或其相關的符號鏈接層次結構不在標準位置,如/usr/lib/
或/lib/
。
有關更多信息,請參閱以下相關StackOverflow answer答案。
的更多信息可以在
感謝appleman1234找到。只需使用另一件事---構建函數中的libdl --- dlopen,dlsym,dlclose。 -----我們是否需要爲加載器添加以下路徑... LD_LIBRARY_PATH或ldconfig? – user1870619