我正在尝试将相机库.so文件动态加载到Linux可执行文件中以获得对简单相机功能的访问.
我试图这样做:
if ( (newHandle = dlopen("./libCamera.so",RTLD_LAZY | RTLD_GLOBAL)) == NULL )
{
printf( "Could not open file : %s\n", dlerror() );
return 1;
}
Run Code Online (Sandbox Code Playgroud)
但是这失败了,我收到以下输出:"无法打开文件:libCamera.so:未定义的符号:ZTVN10 _cxxabiv117__class_type_infoE"
我如何找出它所依赖的符号?
我正在使用dlopen在运行时加载共享库
dlopen("SharedLibarary1.so", RTLD_NOW | RTLD_GLOBAL);
Run Code Online (Sandbox Code Playgroud)
在该共享对象中,我引用另一个共享库"SharedLibarary2.so"中定义的const char*.
Executable和两个库都是使用-rdynamic构建的.
但是在使用dlopen时我仍然遇到运行时错误:"/ usr/lib/SharedLibarary1.so:undefined symbol"并指向错位的const char*有未定义的符号.
Whith GDB"info share"我可以看到第二个库没有在错误点加载.
如果我在第一个库之前在第二个库上执行dlopen,那问题怎么会消失.
有没有更好的方法来强制加载器为未解析的符号加载第二个库?
共享库(.so)文件是否需要在链接时显示(或指定)?
我在这里已经读到了(共享对象(.so),静态库(.a)和DLL(.so)之间的区别?),. so文件必须在编译时出现,但是根据我的经验,这不是真的吗?
共享库不是仅在运行时使用dlopen和链接dlsym,以便在链接应用程序时该库可能不存在于系统上吗?