我有一个需要使用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"
答案 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_INCLUDES
,CMAKE_REQUIRED_LIBRARIES
或documentation中列出的其他一些变量,才能正确运行check_c_*
命令。您可以检查CMakeError.log
文件,查看兼容性检查期间可能发生什么错误。
此外,结果变量HAS_NEW_ENOUGH_OPENSSL
将被缓存,并且如果源文件发生更改也不会更改,因此您可能想在完成使用后对其进行unset
。