簡體   English   中英

使用./調用共享庫

[英]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等)。 ..)。

./.so文件的相對路徑。 這意味着該文件位於當前目錄中。

在* nix中,默認情況下,給定沒有絕對或相對路徑的文件名時, dlopen將在默認位置的設置列表中搜索該庫。

“要點”是在第二個示例中使用雙引號:

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM