C 使用调用共享库/

C 使用调用共享库/,c,C,我很好奇在Linux中使用dlopen调用共享库。 假设我想在C语言中使用一个名为fileName.so的共享库。我在64位Ubuntu Linux中工作,我包括dlfcn.h并使用dlopen函数访问共享库 当我使用dlopen(fileName.so,RTLD\u LAZY)时,将返回一个空句柄,并且不会打开共享库。但是,当我使用dlopen(“./fileName.so”,RTLD\u LAZY)时,dlopen执行其工作并打开共享库。似乎主要的一点是在文件名之前使用/ 如果您能帮我弄清楚

我很好奇在Linux中使用
dlopen
调用共享库。 假设我想在C语言中使用一个名为
fileName.so
的共享库。我在64位Ubuntu Linux中工作,我包括
dlfcn.h
并使用
dlopen
函数访问共享库

当我使用
dlopen(fileName.so,RTLD\u LAZY)
时,将返回一个空句柄,并且不会打开共享库。但是,当我使用
dlopen(“./fileName.so”,RTLD\u LAZY)
时,
dlopen
执行其工作并打开共享库。似乎主要的一点是在文件名之前使用
/

如果您能帮我弄清楚为什么我应该在代码中使用
/
,我将不胜感激。谢谢

POSIX说,当文件名不包含定义的
/
实现时,它必须知道在哪里查找文件,并保留行为。在Linux上,如果不提供路径名(某个地方有一个
/
的名称),则只在“标准位置”中查找,该位置由环境变量指定,如LD\u LIBRARY\u PATH或通过
/etc/LD.so.conf
(或
/etc/LD.so.cache
;另请参见
ldconfig(8)
)或者在标准位置,如
/lib
/usr/lib

当您指定相对名称
/fileName.so
时,它知道在当前目录中查找,而当前目录通常不是它查找的位置

请注意,在同时支持32位和64位可执行文件的系统上,您可能会遇到一些有趣的问题,不同类库的位置使用了各种约定。Unix的其他变体使用模糊相关的系统-目前主要使用
dlopen()
等(历史上并不总是这样),并使用各种环境变量(DYLD\u LIBRARY\u PATH、LIBPATH、SHLIB\u PATH、LD\u RUN\u PATH、LD\u LIBRARY\u PATH\u 32、LD\u LIBRARY\u PATH\u 64等).

POSIX说,当文件名不包含定义的
/
实现时,必须知道在哪里查找文件,并保留行为。在Linux上,如果不提供路径名(某个地方有一个
/
的名称),则只在“标准位置”中查找,该位置由环境变量指定,如LD\u LIBRARY\u PATH或通过
/etc/LD.so.conf
(或
/etc/LD.so.cache
;另请参见
ldconfig(8)
)或者在标准位置,如
/lib
/usr/lib

当您指定相对名称
/fileName.so
时,它知道在当前目录中查找,而当前目录通常不是它查找的位置


请注意,在同时支持32位和64位可执行文件的系统上,您可能会遇到一些有趣的问题,不同类库的位置使用了各种约定。Unix的其他变体使用模糊相关的系统-目前主要使用
dlopen()
等(历史上并不总是这样),并使用各种环境变量(DYLD\u LIBRARY\u PATH、LIBPATH、SHLIB\u PATH、LD\u RUN\u PATH、LD\u LIBRARY\u PATH\u 32、LD\u LIBRARY\u PATH\u 64等).

/
.so
文件的相对路径。这意味着该文件位于当前目录中


默认情况下,在*nix中,当给定的文件名没有绝对或相对路径时,
dlopen
将搜索集合中的库。

/
文件的相对路径。这意味着该文件位于当前目录中

默认情况下,在*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"
#包括
#包括
#包括“myCustomLibrary.h”
第二个示例中的“要点”是使用双引号:

    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"
#包括
#包括
#包括“myCustomLibrary.h”

在Linux(或Unix)上不使用
$PATH
搜索库;这是一个针对DLL的Windows技巧。$PATH通常用于Linux环境中的二进制文件。在Linux(或Unix)上,不使用
$PATH
搜索库;这是针对DLL的Windows技巧。$PATH通常用于Linux环境中的二进制文件。有关dlopen()默认外观位置的详细信息,请参阅Linux。@HevyLight:谢谢URL。我已经把它和POSIX规范URL一起提到了答案中。有关dlopen()默认外观的详细信息,请参阅Linux。@HevyLight:谢谢URL。我把它和POSIX规范URL一起提到了答案中。