7

我有一个 autotools C 项目。

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

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

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

4

3 回答 3

3

在我看来,你想使用 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);

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

于 2013-04-28T14:28:36.340 回答
2

您能否创建一个“指向”libcrypto.so.0.9.8 或 libcryto.so.1.0.0 的软链接。给它一个通用名称然后使用它,那么链接“指向”的任何版本的库都会被拾取吗?在应用安装时,您将软链接设置为指向可用的库版本。如果 lib 足够向后兼容,您的软件可能会被测试到 1.0.0,也就是说,您不依赖 1.0.0 中的某些东西,而 0.9.8 中没有,您可以。

于 2013-04-28T22:40:28.453 回答
2

您可以重建 ssl-0.9.8(不是 1.x,因为它包含一些在旧版本上不起作用的东西)并更改 makefile 中它执行最终共享库链接并嵌入 SONAME 的行

使用从 libssl.so.0.9.8 更改为 libssl.so.0 的 SONAME 重新编译它

它看起来像:-Wl,-soname,libssl.so.0.9.8 将其更改为:-Wl,-soname,libssl.so.0

现在,当您针对此库进行编译时,针对它构建的二进制文件将查找 libssl.so.0(在两个版本中都包含为符号链接)

于 2013-04-29T03:12:46.713 回答