C 多个SO/DLL中的相同符号名

C 多个SO/DLL中的相同符号名,c,gcc,linker,C,Gcc,Linker,我有一组lib*。因此库中定义了一个符号uint64\u t VERSION。加载这些插件库有两种方式,一种是通过dl\u open(),另一种是在编译时链接。无论这些插件在主程序中以何种方式显示,我都希望基于VERSION变量执行一些代码。例如,为每个加载的库打印一个简单的版本号 可能吗?如果是,怎么做 我一直在阅读弱链接,但我不知道这是否适合我的要求,也不知道如何正确使用它。有更好的方法吗?使用dlopen(),您可以通过dlsym()检索指向库中符号的指针,传递库句柄而不是可执行文件的通用

我有一组
lib*。因此
库中定义了一个符号
uint64\u t VERSION
。加载这些插件库有两种方式,一种是通过
dl\u open()
,另一种是在编译时链接。无论这些插件在主程序中以何种方式显示,我都希望基于
VERSION
变量执行一些代码。例如,为每个加载的库打印一个简单的版本号

可能吗?如果是,怎么做


我一直在阅读
弱链接,但我不知道这是否适合我的要求,也不知道如何正确使用它。有更好的方法吗?

使用
dlopen()
,您可以通过
dlsym()
检索指向库中符号的指针,传递库句柄而不是可执行文件的通用句柄。然后,您可以通过
dlsym()
返回的指针访问每个单独的
版本
变量。例如:
void*so_1=dlopen(…);uint64_t*vp_1=dlsym(so_1,“版本”);void*so_2=dlopen(…);uint64_t*vp_2=dlsym(so_2,“版本”);printf(“V1=%“PRIu64”,V2=%“PRIu64”\n”,*vp_1,*vp_2)。我几乎可以肯定,如果库在编译时链接(而不是通过
dlopen()
加载),那么获取不同版本号变量的方法并不简单。库中的第一个
版本成为程序的
版本。使用
dlopen()
和一些特定于平台的黑魔法,可能会有复杂的方法找到其他方法。那么有更好的方法吗?从任何加载的插件获取版本号,无论以何种方式加载。