Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行时检查动态库的兼容性 我正在开发一个C++应用程序,它需要在DLOPEN中在运行时加载动态库。这个图书馆一般不会由我来写_C++_Linux_Dlopen - Fatal编程技术网

在运行时检查动态库的兼容性 我正在开发一个C++应用程序,它需要在DLOPEN中在运行时加载动态库。这个图书馆一般不会由我来写

在运行时检查动态库的兼容性 我正在开发一个C++应用程序,它需要在DLOPEN中在运行时加载动态库。这个图书馆一般不会由我来写,c++,linux,dlopen,C++,Linux,Dlopen,人们推荐什么方法来确保这个库和我的应用程序之间未来的二进制兼容性 我看到的选项有: 将版本号放在库文件名中,并尝试通过符号链接加载它。如果dlopen失败,请报告错误 维护第二个接口,该接口返回版本号。但是,如果这个接口由于某种原因发生更改,我们将遇到与以前相同的问题 还有其他选项吗?您应该定义一个关于动态加载的约定,即打开DLED库 您可能有这样的约定,即要求库提供常量char mylib_version_str[];符号,它给出了API的版本等。当然,您可以有自己的预处理器技巧来帮助实现这一

人们推荐什么方法来确保这个库和我的应用程序之间未来的二进制兼容性

我看到的选项有:

将版本号放在库文件名中,并尝试通过符号链接加载它。如果dlopen失败,请报告错误

维护第二个接口,该接口返回版本号。但是,如果这个接口由于某种原因发生更改,我们将遇到与以前相同的问题


还有其他选项吗?

您应该定义一个关于动态加载的约定,即打开DLED库

您可能有这样的约定,即要求库提供常量char mylib_version_str[];符号,它给出了API的版本等。当然,您可以有自己的预处理器技巧来帮助实现这一点

为了给你灵感,你可以看看GCC需要什么,比如插件是GPL兼容的符号


如果动态加载的库是C++,您可以使用它来检查函数的签名……< /p> ,您应该定义一个关于动态加载的约定,即DLPEND ED库。 您可能有这样的约定,即要求库提供常量char mylib_version_str[];符号,它给出了API的版本等。当然,您可以有自己的预处理器技巧来帮助实现这一点

为了给你灵感,你可以看看GCC需要什么,比如插件是GPL兼容的符号


如果动态加载的库是C++,您可以使用它来检查函数的签名……< /p> 为什么不使用这两个选项?到目前为止,很少有库已经这样做了,例如,旧的dll是Lua51.dll,然后你有Lua52等,你也可以查询它的版本

一个好的接口可以改变,但不是经常改变,为什么两个简单的静态方法

const char* getLibraryName();
uint32 getLibraryVersion();

更改加班时间?

为什么不同时使用这两个选项?到目前为止,很少有库已经这样做了,例如,旧的dll是Lua51.dll,然后你有Lua52等,你也可以查询它的版本

一个好的接口可以改变,但不是经常改变,为什么两个简单的静态方法

const char* getLibraryName();
uint32 getLibraryVersion();

更改超时时间?

如果您/他们使用libtool构建库/应用程序,您可以这样建议:

如果您/他们使用libtool构建库/应用程序,您可以这样建议:

这样做的好处是您不需要运行任何代码。只要库使用正确的格式(例如elf),就可以读取任何静态字符串。考虑有人在32位系统上加载一个64位的LIB。他们仍然可以读取版本信息。我不确定您是否可以在纯32位系统上打开64位库!这样做的好处是您不需要运行任何代码。只要库使用正确的格式(例如elf),就可以读取任何静态字符串。考虑有人在32位系统上加载一个64位的LIB。他们仍然可以读取版本信息。我不确定您是否可以在纯32位系统上打开64位库!在你的答案中加上一小段摘录。仅链接不被视为有效答案。请在答案中添加一个小摘录。仅仅链接并不被认为是一个有效的答案。