“try_compile”和“try_run”在错误的源代码上都无法正确运行?

问题描述 投票:0回答:1

我有这个简单的 C 代码,它检查 MUSL,否则给出的语法将无法编译:

set(is_musl_src [=[
#include <stdlib.h>

#ifndef _GNU_SOURCE
    #define _GNU_SOURCE
    #include <features.h>
    #ifndef __USE_GNU
        #define __MUSL__
    #endif
#else
    #include <features.h>
    #ifndef __USE_GNU
        #define __MUSL__
    #endif
#endif

#ifdef __MUSL__
int main(void) {
    return EXIT_SUCCESS;
#else
#include "noottt.h"
$$#@ 4 5%905i035 35 45 34%^5
#endif
}
]=])

我还在最后尝试了正常语法,例如:

int main(void) {
#ifdef __MUSL__
    return EXIT_SUCCESS;
#else
    return EXIT_FAILURE;
#endif
}

但是,无论我尝试什么,这些变量在 Ubuntu (glibc) 和 Alpine (musl) 上都给出相同的结果:

check_c_source_runs("${is_musl_src}" IS_MUSL)
try_compile(COMPILE_RESULT_VAR0
        SOURCE_FROM_VAR is_musl.c is_musl_src
        C_STANDARD 90
)
try_run(RESULT_VAR
        COMPILE_RESULT_VAR1
        SOURCE_FROM_VAR is_musl.c "${is_musl_src}"
        C_STANDARD 90
)
try_run(RESULT_VAR
        COMPILE_RESULT_VAR2
        SOURCE_FROM_VAR is_musl.c is_musl_src
        C_STANDARD 90
)
message(STATUS "IS_MUSL = ${IS_MUSL}")
message(STATUS "RESULT_VAR = ${RESULT_VAR}")
message(STATUS "COMPILE_RESULT_VAR0 = ${COMPILE_RESULT_VAR0}")
message(STATUS "COMPILE_RESULT_VAR1 = ${COMPILE_RESULT_VAR1}")
message(STATUS "COMPILE_RESULT_VAR2 = ${COMPILE_RESULT_VAR2}")
cmake
1个回答
0
投票

你的错误很简单,但很容易被绊倒。引用自我本地 glibc 系统上的

man 7 feature_test_macros

注意:为了有效,必须在包含任何头文件之前定义功能测试宏。

_GNU_SOUCE
是这些功能测试宏之一,必须在包含 any 头文件之前定义。从测试中删除
#include <stdlib.h>

© www.soinside.com 2019 - 2024. All rights reserved.