动态加载.so文件并引用符号

时间:2020-09-03 10:54:13

标签: c++ c linux shared-libraries dynamic-library

我正在开发一个使用应用程序驱动程序的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)```

1 个答案:

答案 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);