c - 如何编译同时适用于 libcrypto.so.0.9.8 和 libcryto.so.1.0.0 的二进制文件?

标签 c openssl autotools libssl

我有一个 autotools C 项目。

我如何编译一个同时适用于 libcrypto.so.0.9.8 和 libcryto.so.1.0.0 的二进制文件? (即 Ubuntu 9.10 和 12.04)

根据我在其上构建的操作系统的年龄,二进制文件需要一个版本或另一个版本。

有没有办法让它不在乎,或者 libcryto 版本之间的差异是无法克服的?

最佳答案

在我看来,您想使用 libcrypto.so.0.9.8 的一些功能和 libcryto.so.1.0.0 的一些功能。如果大多数功能是 1.0.0 所必需的或者是首选,则链接到 libcrypto.so.1.0.0。

您可能需要 libcrypto.so.0.9.8 中的一些功能,或者您可能有其他充分的理由使用 libcrypto.so.0.9.8。

在我看来,如果您从这两个库链接,您将收到链接器错误(重复符号,因为两个库都包含相同的符号)。

如果您需要使用 0.9.8,则使用 dlopen 动态加载它并获取您想要与 dlsym 一起使用的函数回调。

这可以通过以下方式完成:

void * handle;
/*reqd_callback is the callback of required function.*/
reqd_callback cb;

handle = dlopen ("libcrypto.so.0.9.8", RTLD_LAZY);
cb     = (reqd_callback)dlsym(handle, "reqd_function");
//Call the cb
cb (parameters);

//Close the library.
dlclose(handle);

我认为这可能会解决您的目的。如果偏好是反向的,则在链接和通过程序加载时反转库。

关于c - 如何编译同时适用于 libcrypto.so.0.9.8 和 libcryto.so.1.0.0 的二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16088261/

相关文章:

c++ - 在使用特定标志时添加#define

c++ - 如何在运行时摆脱 LD_LIBRARY_PATH?

c - header 命名约定

c - #在c中定义数组格式

c++ - Linux, openssl : where is THIRTY_TWO_BIT defined?

php - Apple 推送通知服务

linux - 如何为 ARM 交叉编译 autotools 项目?

c - 如何在 C 中设置 GNUPLOT 线的颜色

C unsigned int 比较 - 环绕自定义位数

c - SSL_read 解密错误代码