Yu-*_*hih 1 c c++ ssl openssl forward-declaration
我知道这个问题听起来很愚蠢......我正在一个使用大量openssl库的项目中工作.我目前正在努力将使用过的库从1.0升级到1.1,这给了我很多困难.Openssl社区决定让人们不再访问其BIO,SSL,RSA,EVP_PKEY的内部结构.这似乎是一个很好的方向,但我使用这些结构有数千行代码(例如EVP_PKEY *key; key->reference = XXX;).
我注意到openssl通过前向声明隐藏这些代码(即,将公共头部分隔为公共头部+私有头部).
例如,旧结构中的代码如下所示:include/obj.h:
struct obj_st {
int property1, int property2 ....etc
}
Run Code Online (Sandbox Code Playgroud)
新结构变为include/obj.h:
struct obj_st;
Run Code Online (Sandbox Code Playgroud)
包括/ obj_private.h:
struct obj_st {
int property1, int property2 ....etc
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我将整个openssl编译为静态库.我的代码包括它#include<openssl/obj.h>不再能够访问这些属性.
处理它的一个简单方法是,我只是将所有这些私有头文件移回原始格式(没有前向声明).但这意味着每次拉新的openssl代码时我都需要这样做.
是否有任何简单的黑客攻击我可以让它们再次曝光?我想在我的代码中包含私有标头(例如#include<openssl/obj_private.h>),但许多私有标头也依赖于其他标头,结果我需要将所有标头复制到我的usr/include/openssl文件夹.我不确定这是不是一个好主意....
简短版:你没有.
长版本:有一个严重的原因,库开发人员正在尝试使公共API尽可能简洁和简单,同时隐藏库用户的实现细节.原因是,只要API合同得到维护,不是API的一部分的代码可能会在没有任何公告的情况下自由更改.
重点是,如果库开发人员决定隐藏以前暴露过的东西(这是一个非常强烈的移动,我不知道,但我相信你),他们有一个严重的意图在未来.如果他们在某些时候这样做,你的代码将以最扭曲的方式破坏(考虑到你愿意升级,我想你将根据你的问题) - 并且对结构成员的访问对你没有帮助.
所以,遗憾的是,最好的行动方案是重构代码,以便使用新的,不太方便的API.作为图书馆开发人员和图书馆用户,我很抱歉.