You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何try_compile与try_run处理错误源码时表现异常?

MUSL检测代码在CMake中失效问题

我编写了两段用于检测MUSL的C代码:一段在非MUSL环境下会生成无法编译的代码,另一段采用正常语法编写。但无论使用哪段代码,在Ubuntu(glibc)和Alpine(musl)环境中,通过check_c_source_runs、try_compile、try_run得到的变量结果完全一致,无法区分两种libc环境。

含错误分支的检测C代码

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
}
]=])

正常语法的检测C代码

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

测试用CMake代码

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}")

内容的提问来源于stack exchange,提问作者Samuel Marks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 09:12:17