【问题标题】:Check for compatibility检查兼容性
【发布时间】:2020-01-21 08:50:41
【问题描述】:

我有一个需要使用 cmake 编译的 openssl 的应用程序。稳定的 AIX 7.1 cmake 版本是 3.14.3

在 cmake 构建文件中我有以下测试

include(CheckCSourceCompiles)
check_c_source_compiles(check_openssl.c HAS_NEW_ENOUGH_OPENSSL)

check_openssl.c

#include <stdio.h>
#include "/usr/local/include/openssl/ossl_type.h"
#include "/usr/local/include/openssl/evp.h"

int main(int argc, char **argv){
   printf("out = %d", !EVP_aes_256_ctr);
   return !EVP_aes_256_ctr;
}

gcc 编译完全没有问题,并且注释按预期打印出来。但是,当我使用 cmake 测试它时出现编译错误。

更新 1: 遵循@squareskittles 的回答并将 cmake 升级到 3.15.0(从 AIX 中的源代码构建)后,我仍然一无所获。我收到的唯一错误消息是-- Performing Test HAS_NEW_ENOUGH_OPENSSL - Failed

至于我用于构建的命令

cmake -DJVM_ARCH_DATA_MODEL=64 -DUSE64bit=true -G "Unix Makefiles"

【问题讨论】:

  • 您是否收到任何错误消息,或者只是 不起作用?(注意:它实际上是 AIX3 吗?那么您的硬件现在已经 20 多年了,是不是吗?)
  • 我的错误是没有更清楚。至于错误信息,我没有得到任何信息
  • 好的。你究竟尝试了什么命令,你得到了什么结果?什么都没发生?
  • "当我使用 cmake 测试时出现编译错误。" - 显示该错误(将其添加到问题帖子中)。
  • @CandyHo 您的 C 代码需要inline 放在您的 CMake 文件中,用引号括起来。请参阅我的扩展答案。

标签: cmake gnu aix


【解决方案1】:

编辑:check_c_source_compiles() 的正确使用需要在您的 CMake 文件中插入实际的 C 代码内联。此外,由于您的代码包含引号,因此您必须使用反斜杠 (\") 转义引号。请参阅下面的示例。


这个check_c_source_compiles() 命令应该用于检查是否可以编译源代码并将其链接到可执行文件。如果可以,那么您应该使用add_executable() 或add_library() 来实际编译它。编译后,您可以运行它来打印评论消息。或者,如果您想一次性检查编译、链接和运行兼容性,您应该使用check_c_source_runs(),正如@Tsyvarev 建议的那样。您尚未发布完整的代码示例,但我想您可以执行以下操作:

# Check for compile, link, run compatibility.
include(CheckCSourceRuns)
check_c_source_runs(
    "
    #include <stdio.h>
    #include \"/usr/local/include/openssl/ossl_type.h\"
    #include \"/usr/local/include/openssl/evp.h\"

    int main(int argc, char **argv){
        printf(\"out = %d\", !EVP_aes_256_ctr);
        return !EVP_aes_256_ctr;
    } 
    "
    HAS_NEW_ENOUGH_OPENSSL
)

# Build if it is compatible.
if(HAS_NEW_ENOUGH_OPENSSL)
  add_executable(MyOpenSslTest check_openssl.c)
endif()

...

unset(HAS_NEW_ENOUGH_OPENSSL CACHE)

注意:这些命令依赖于其他变量来检索所有必要的编译/链接选项以成功测试兼容性。您可能需要设置CMAKE_REQUIRED_INCLUDES、CMAKE_REQUIRED_LIBRARIES 或documentation 中列出的一些其他变量才能运行check_c_* 命令而不会出错。您可以检查CMakeError.log 文件以查看兼容性检查期间可能出现的错误。

另外,结果变量HAS_NEW_ENOUGH_OPENSSL 将被缓存,并且不会在源文件更改时更改,因此您可能希望在使用完后unset。

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 2018-07-29
    • 2019-02-08
    • 1970-01-01
    • 2015-06-06
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多