gpt4 book ai didi

linux - 我可以有一个仅在代码使用时才需要的动态库吗?

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:20 28 4
gpt4 key购买 nike

我有一个大型程序,可能会链接到一些外部库,但这些仅用于某些特定功能。但是,即使我不使用这些函数,仍然需要外部库。我可以做一些事情(最好是在编译或链接时)以便仅在请求库提供的功能时才需要这些库吗?

示例:

你好.c

#include <stdio.h>
#include <unistd.h>
extern const char *myfunc();

main() {
int z;
char buf[32];
z = gethostname(buf,sizeof buf);
if (strcmp(buf,"#!#!#!#!#") == 0) {
printf("%s\n", myfunc());
} else {
printf("%s\n", "No library used");
}
return 0;
}

shrobj.c:

const char *myfunc() {
return "Hello World";
}

编译为:

$ gcc -fpic -c shrobj.c
$ gcc -shared -o libshared.so shrobj.o
$ gcc hello.c -lshared -L.
$ ./a.out
./a.out: error while loading shared libraries: libshared.so: cannot open shared object file: No such file or directory

而且我的主机名显然不是 #!#!#!#!#:

$ LD_LIBRARY_PATH=. ./a.out 
No library used

所以,我想要的是能够在没有库的情况下运行“./a.out”(无论出于何种原因,该库可能不可用),只要它的函数没有被调用。

我已经看到可以使用 dlopen() 获得延迟加载,但是,即使上面的示例是用 C 编写的,我的大部分代码都是用 Fortran 编写的,特别是可能调用库中函数的部分。

最佳答案

Linux 已经可以通过其内核 API 来做到这一点;具体来说,是 dlopen(3) 函数。如果您想了解详细信息,请使用 man 进行查找。

基本上,您使用要加载的库的名称调用 dlopen ,它会返回该库的句柄,您需要保存该句柄以供稍后使用。

void* lib = dlopen("./lib.so"); // this can be any path

要从该库加载函数,您可以使用dlsym函数,并将其返回值分配给一个函数指针,然后您可以像程序中的任何其他函数一样调用该指针(好吧,大多数情况下)。

int (*func)() = dlsym(lib, "thing");

完成后,您需要告诉内核您已经完成了库的使用:

dlclose(lib)

为了简洁起见,我在此处省略了错误检查,但您需要在实际代码中执行此操作。

这样做意味着除非需要,否则您的程序不会尝试加载库,因此如果所需的库或依赖项未安装或丢失,您的代码可以检测到并使用其他内容。您的程序 - 只要正确编写 - 就不会在启动时崩溃,但如果您非常依赖该库并且无法找到它,则可能会因错误而退出。

关于linux - 我可以有一个仅在代码使用时才需要的动态库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28051729/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com