【问题标题】:How to disable strict const check during compile using gcc?如何在使用 gcc 编译期间禁用严格的 const 检查?
【发布时间】: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


【解决方案1】:

感谢纠正我的 Guillaume Petitjean,我没有理解 openssl 头文件中的注释的含义。 我得到的错误是由于其他原因。我的一个包中有一个旧版本的 openssl,它在构建后安装了它的头文件。在那个版本中,api BIO_read_filename 不是由 marco 定义实现的,而是在源文件中实现的。我修改了包的makefile,不安装旧的openssl头文件,错误消失了。

【讨论】:

    猜你喜欢
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多