是否可以用CMake将某个符号替换为不同的符号

Is it possible to replace certain symbol to different symbol with CMake?

本文关键字:符号 替换 CMake 是否      更新时间:2023-10-16

我正在尝试用CMake制作一个可执行文件。此可执行文件需要位于项目中的文件的完整路径。

int main()
{
    std::ifstream("fullpath_to_file");
    //....
}

我认为如果CMake可以用用户指定的字符串替换源代码中的某些符号,就不需要硬编码完整路径。

例如,如果CMake可以将源代码(cpp)中的${CMAKE_PROJECT_DIR}替换为CMake的变量,如${PROJECT_source_DIR},那么我就可以编写这样的源代码。

int main()
{
    std::ifstream("${CMAKE_PROJECT_DIR}/input/my_input.txt");
    //....
}

有办法做到这一点吗?

谢谢。

向源文件公开尽可能多的CMake变量的一个好方法是为项目创建一个配置头。首先,为头创建一个模板,称之为config.h.in,并定义您希望CMake在构建时设置的符号,例如config.h.in的内容,在您的情况下可以是

#ifndef __CONFIG_H__
#define __CONFIG_H__
#define PROJECT_DIR @CMAKE_PROJECT_DIR@
#endif

然后在CMakeLists.txt中添加一条更改此配置标头的指令,并将@之间的值替换为相应cmake变量的值。例如,将以下内容放入CMakeLists.txt中:

include_directories(${CMAKE_BINARY_DIR})
config_file(
    ${CMAKE_SOURCE_DIR}/config.h.in
    ${CMAKE_BINARY_DIR}/config.h
)

然后CMake将创建config.h,其中包含要从源访问的值的定义。现在您所要做的就是:将config.h包含在您的c++源代码中,并按预期使用PROJECT_DIR宏。

否,CMake不能直接执行此操作。您不应该这样做,因为您必须将源代码放在构建目录中,而不是放在源目录中。

对于C++和CMake,通常的方法是在C++代码和中使用宏FOO_PATH

  1. 通过CMake传递CCD_ 3
  2. 在配置文件config.h中添加define #cmakedefine FOO_PATH FOO_PATH,在CMake代码中定义FOO_PATH,然后重新生成配置

使用ctest时如何做到这一点。在此实例中,没有要包含的.h文件,但需要修改已编译的.cc文件吗?这样它就不会修改原始的${CMAKE_SOURCE_DIR}文件

add_compile_definitions(TEST_DATA_DIR="${CMAKE_SOURCE_DIR}/data")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/test_file.cc 
               ${CMAKE_CURRENT_BINARY_DIR}/test_file.cc)

在C++中:

std::string filename = "TEST_DATA_DIR/data.txt";
std::cout << filename << std::endl;
...

输出";TEST_DATA_DIR/DATA.txt";