在基于 unix 的系统中,什么是延迟加载。
我有一个代码 foo.cpp
,在用 gcc 编译时我将它链接到共享对象(总共有三个 .so 文件。)。每个 .so 文件都有不同的选项。
./foo -v
需要 libversion.so
./foo -update
需要 libupdate.so
我需要那些库的符号应该只在运行时解析。
./foo -v
即使没有 libupdate.so 库也不应该中断。
它在 Windows 中使用延迟加载选项(在 dll 的属性中)工作。它在 unix 系统中的等价物是什么。
-lazy
选项会在 UNIX 中做同样的事情吗?如果是这样,在哪里包含此选项:在 makefile 中还是使用链接器 ld?
最佳答案
请参阅系统上有关 dlopen() 的引用资料。您可以在运行时而不是链接时手动打开库并解析外部符号。
挖出一个例子:
int main(int argc, char **argv) {
void *handle=NULL;
double (*myfunc)(double);
char *err=NULL;
handle = dlopen ("/lib/libm.so.1", RTLD_LAZY);
if (!handle) {
err=dlerror();
perror(err);
exit(1);
}
myfunc = dlsym(handle, "sin");
if ((err = dlerror()) != NULL) {
perror(err);
exit(1);
}
printf("sin of 1 is:%f\n", (*myfunc)(1.));
dlclose(handle);
return 0;
}
关于c - 基于 unix 的系统中的延迟加载等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2957292/