如何解决动态加载.so文件并引用符号
我正在开发一个使用应用程序驱动程序的Linux C ++应用程序。硬件开发人员提供SDK(包括和库)。我想通过dlopen()动态使用库,以使应用程序在没有驱动程序的情况下工作(或者,也许还有其他驱动程序)。
当我以这种方式使用其中一个库中的方法时:
int (*VCI_OpenCAN)(PVCI_CAN_PARAM) = (int(*)(PVCI_CAN_PARAM))dlsym(_driver_library,"VCI_OpenCAN");
int open_code = VCI_OpenCAN(&vcparam);
if ( 0 == open_code) {
qDebug() << "ERROR: " << open_code;
exit(1);
}
它告诉我,有一个未解决的符号Open_Com。好的,它可能在VCI_OpenCAN内部被调用,但是nm告诉库中有U(未定义)符号Open_Com(例如lib1.so)。我四处寻找,并在SDK捆绑的另一个库(lib2.so)中找到了Open_Com。
所以问题是-我如何(并且有可能?)启用两个库的动态加载并使它们彼此看到符号,或者唯一的解决方案是静态链接?静态链接有效,捆绑的示例使用
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ i7565H1H2.o ../lib/libI7565H1H2_64.so.1.0 ../lib/libi7k_64.so.1.0 $(AM_LDFLAGS)```
解决方法
也可以手动dlopen第二个库,使用RTLD_GLOBAL标志是解决方案。
_i7k_library = dlopen("/home/kkursor/tmp/libi7k_64.so.1.0",RTLD_GLOBAL | RTLD_NOW);
_driver_library = dlopen(config.value(section + "/driver_library").toString().toLocal8Bit(),RTLD_LAZY);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。