【发布时间】:2021-12-21 02:06:22
【问题描述】:
我最近在做一些编译工作。 在将 openssl1.1.1f 更新为 openssl1.1.1h 后,我遇到了一些使用 openssl 头文件“bio.h”和“evp.h”的包的编译错误。 那是因为 openssl1.1.1h 添加了这样的内容:
/*
* name is cast to lose const, but might be better to route through a
* function so we can do it safely
*/
#ifdef CONST_STRICT
/*
* If you are wondering why this isn't defined, its because CONST_STRICT is
* purely a compile-time kludge to allow const to be checked.
*/
int BIO_read_filename(BIO *b, const char *name);
# else
# define BIO_read_filename(b,name) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, \
BIO_CLOSE|BIO_FP_READ,(char *)(name))
# endif
如果定义了 CONST_STRICT marco,则必须自己实现 api,否则在链接阶段会出现未定义的引用错误。 我想知道我必须添加什么编译选项才能使 CONST_STRICT marco 未定义? 提前致谢!
【问题讨论】:
-
您是否确定您需要自己实现此功能,并且您不会只是忘记链接某个库?
-
是的,我想是的。我搜索了libopenssl编译生成的库,没有找到这些函数。
-
您的问题是:如何取消定义 CONST_STRICT ?为什么不注释掉应该在 .h 文件或项目设置中某处的
#define CONST_STRICT? -
正如解释的那样,宏
BIO_read_filename只是摆脱constqualifier 并避免编译错误的技巧。你可以实现一个真正的函数而不是这个宏,它会设法将 const 转换为 unconst。 -
@Guillaume Petitjean 也许我没有理解 openssl 标头中的注释是什么意思? marco CONST_STRICT 不是由编译过程自动生成的,而是由想要手动使用某些用户定义的 api 的人定义的?
标签: c gcc compilation