[英]Calling a shared library using ./
我很好奇在Linux中使用dlopen
調用共享庫。 假設我想在C中使用一個名為fileName.so
的共享庫。 我正在64位Ubuntu Linux上工作,並且包含dlfcn.h
並使用dlopen
函數訪問共享庫。
當我使用dlopen(fileName.so, RTLD_LAZY)
,將返回NULL句柄,並且不會打開共享庫。 但是,當我使用dlopen("./fileName.so", RTLD_LAZY)
, dlopen
執行其工作並打開共享庫。 似乎要點是在文件名之前使用./
。
如果能幫助我弄清楚為什么要在代碼中使用./
,將不勝感激。 謝謝
POSIX表示dlopen()
必須知道在哪里尋找文件,並且當文件名不包含定義的/
實現時,該行為將保留。 在Linux上,如果不提供路徑名(名稱中帶有/
的名稱),則dlopen()
僅在“標准位置”中查找,該位置由環境變量(例如LD_LIBRARY_PATH或通過/etc/ld.so.conf
(或/etc/ld.so.cache
;另請參閱ldconfig(8)
)或標准位置,例如/lib
和/usr/lib
。
當您指定相對名稱./fileName.so
,它將知道在當前目錄中查找,該目錄通常不是它所在的位置。
請注意,在同時支持32位和64位可執行文件的系統上,您可能會遇到一些有趣的問題,並且對於不同類庫的位置使用了各種約定。 Unix的其他變體使用模糊的相關系統- dlopen()
大多數情況下都使用dlopen()
等(從歷史上看,並非總是如此),並使用各種環境變量(DYLD_LIBRARY_PATH,LIBPATH,SHLIB_PATH,LD_RUN_PATH,LD_LIBRARY_PATH_32,LD_LIBRARY_PATH_64等)。 ..)。
“要點”是在第二個示例中使用雙引號:
dlopen("./fileName.so", RTLD_LAZY)
如果要包括自己的庫/文件名,請用雙引號將其引起來。 您甚至不需要./
,只要文件位於./
建議的當前目錄中即可。
按照dlopen手冊頁的示例:
handle = dlopen("libm.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
文件名用引號引起來。
但是,如先前的回答所指定,dlopen將在“標准”位置查找“包含”。 在工作目錄中包含一個庫的另一種方法(盡管顯然不是共享系統庫)是使用預處理器指令,並將文件名括在雙引號中:
#include <stdio.h>
#include <stdlib.h>
#include "myCustomLibrary.h"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.