检查兼容性

时间:2019-09-20 09:49:00

标签: cmake gnu aix

我有一个需要使用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"

1 个答案:

答案 0 :(得分:2)

编辑:正确使用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_INCLUDESCMAKE_REQUIRED_LIBRARIESdocumentation中列出的其他一些变量,才能正确运行check_c_*命令。您可以检查CMakeError.log文件,查看兼容性检查期间可能发生什么错误。

此外,结果变量HAS_NEW_ENOUGH_OPENSSL将被缓存,并且如果源文件发生更改也不会更改,因此您可能想在完成使用后对其进行unset