我想创建一个共享库libdependent
,使用头文件使用libparent
中的某些导出函数。
构建阶段不知道libparent
的路径,因此我无法使用rpath
,而是在运行时调用dlopen("path/libparent.so", RLTD_NOW | RTLD_GLOBAL)
和dlopen("path/libdependent.so", RLTD_NOW | RTLD_GLOBAL)
。
但如果在链接和使用libparent
期间将libdependent
放入库搜索路径,则libparent.so
文件中根本没有引用-lparent
。
当我尝试dlopen
libdependent
时,即使设置了RTLD_GLOBAL
,也会出现“找不到符号”错误。
如果不调用libparent
而使用dlsym
的导出,我该怎么办?
答案 0 :(得分:1)
首先,当你想要创建一个库时,你不必导入它,所以
dlopen(“path / libdependent.so”,RLTD_NOW | RTLD_GLOBAL)
不需要。
其次,如果您不确切知道将要使用的库(libparent)的名称,则必须使用动态链接和 dlopen 。在动态链接中,您不必通知链接器您的libparent库,但您必须使用动态链接库,因此链接器命令将如下所示:
g ++ -o output -dl input.cpp
dl 表示您将使用 dlopen 。
使用程序时,请确保从运行目录中可以看到libparent.so(或使用绝对路径)。还要检查dlopen的返回值以了解库开放的成功。
void *handle = NULL;
handle = dlopen("libparent.so", RTLD_LAZY);
if(!handle){
printf("Error!\r\n");
}
希望它有所帮助。
答案 1 :(得分:0)
通过将-shared
添加到链接器选项并在-l
中指定库来解决此问题。 -(
也很有用。