我正在开发一个使用应用程序驱动程序的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)```
答案 0 :(得分:0)
也可以手动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);