CMake:选择在运行时加载共享库

ruyhziif  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(70)

我有一组共享库,并希望在运行时根据程序运行的设备选择加载哪一个。
其中一个共享库在我的CMakeLists中构建为目标,该目标还包括与不同库接口所需的头文件。其他共享库将已经构建,并且.so s将在运行时位于已知位置。
我试图找到一个解决方案,在那里我可以使用来自共享库目标的头文件,但要选择在运行时实际使用哪个共享库。
这可能吗?

afdcj2ne

afdcj2ne1#

这可能吗?
便携式?不需要。延迟运行时链接到共享对象是Windows平台的一个特性,所以你可以在那里实现它,而不需要对应用程序的C/C代码做太多修改。
否则,唯一的半可移植方法是强制运行时解析库符号,因此您首先使用dlopenLoadLibrary打开所需的库,然后在其中查找符号,并将它们转换为适当类型的数据或函数指针。
在C
中,为了让你的生活更轻松,指针可以从库头中假设类型,所以打字错误的可能性较小:

#include <cstdlib>
#include <type_traits>

// This declaration lives in some library header
void * LIB_fun_1(int, char *);

void test()
{
    auto libhandle = dlopen(...);
    if (!libhandle) abort();
    // here, pLIB_fun_1 will have a proper type for calling LIB_fun_1,
    // using decltype<&LIB_fun_1>
    auto pLIB_fun_1 = 
        reinterpret_cast<decltype(&LIB_fun_1)>(dlsym(libhandle, "LIB_fun_1"));

    // pLIB_fun_1 can be used here

    dlclose(libhandle);
}

字符串

相关问题