我有这个简单的 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}")
你的错误很简单,但很容易被绊倒。引用自我本地 glibc 系统上的
man 7 feature_test_macros
注意:为了有效,必须在包含任何头文件之前定义功能测试宏。
_GNU_SOUCE
是这些功能测试宏之一,必须在包含 any 头文件之前定义。从测试中删除 #include <stdlib.h>
。