sar*_*ran 8 c unix linker shared object
什么是基于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;
}
Run Code Online (Sandbox Code Playgroud)