使用cmake传递变量并在C程序中打印

Pass variable using cmake and print it in C program

我正在尝试通过 C 代码获取提供给 cmake 调用的值,以便可以打印它。它应该像这样传递 cmake -DSTR="some text" .. 然后在 main.c 我会做类似 puts(STR) 的事情来打印它。

这是我目前在 CMakeLists.txt 中的内容,但它不起作用:

project(proj)
cmake_minimum_required(VERSION 3.0)

add_definitions(-DSTR)
add_executable(main main.c)

您可以使用 configure_file 和一个辅助文件来实现它。例如

// File: support_macros.h.in (auxiliary file)

// This file is generated by CMake. Don't edit it.

#define VAR "@VAR@"
// File: main.c

#include "support_macros.h"
#include <stdio>

int main()
{
    puts(VAR);
    // ...
}
# File: CMakeLists.txt

project(proj)
cmake_minimum_required(VERSION 3.0)

# Not needed
# add_definitions(-DSTR)
add_executable(main main.c)

# -- Generate support_macros.h from support_macros.h.in
set(IN_FILE "${CMAKE_SOURCE_DIR}/support_macros.h.in")
set(GENERATED_FILE_PATH "${CMAKE_BINARY_DIR}/GeneratedFiles")  
set(OUT_FILE "${GENERATED_FILE_PATH}/support_macros.h")
configure_file("${IN_FILE}" "${OUT_FILE}" @ONLY)

# -- Make sure main.c will be able to include support_macros.h
target_include_directories(main PRIVATE "${GENERATED_FILE_PATH}")

然后,调用 cmakeVAR 传递一个值:

$ cmake .. -DVAR="some text"

注意: 通过在 support_macros.h.in 中的 @VAR@ 周围加上引号,即使您不传递值,您的 main.c 也会编译对于 VARcmake.

如果你想使用puts(STR),那么STR里面必须有"。您必须传递带有嵌入引号的变量值。对于简单的情况:

project(proj)
cmake_minimum_required(VERSION 3.0)
add_definitions( "STR=\"${STR}\"" )
add_executable(main main.c)