C 使用调用共享库/
我很好奇在Linux中使用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执行其工作并打开共享库。似乎主要的一点是在文件名之前使用/ 如果您能帮我弄清楚
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一起提到了答案中。