您不能LD_LIBRARY_PATH
在运行时更改,动态加载程序在程序执行时读取一次并且不再检查它,您可以使用dlopen()代替自己加载共享库:
dlopen("/path/to/shared/lib.so", RTLD_LAZY);
这仅在您加载库并dlsym()
在运行时使用来查找符号时才有效,否则如果您调用库中的函数,则必须在加载时解析这些引用,并且 AFAIK 您必须使用类似 bashscript 的东西。
注意:如果您重新执行该过程,可以在运行时更改LD_LIBRARY_PATH
,我刚刚测试过它,它似乎工作,但它非常hackish,它可能是唯一的方法C
:
void *handle;
// first time check if path is not set
if (getenv("LD_LIBRARY_PATH")==NULL) {
//set it and re-execute the process
setenv("LD_LIBRARY_PATH", "/path/to/lib/", 1);
execl(argv[0], argv[0], NULL);
}
// open the shared library the second time
handle = dlopen("test.so", RTLD_LAZY);
printf("%p\n", handle);
dlclose(handle);