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

Jae*_*LEE 4 c++ cmake

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

int main()
{
    std::ifstream("fullpath_to_file");
    //....
}
Run Code Online (Sandbox Code Playgroud)

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

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

int main()
{
    std::ifstream("${CMAKE_PROJECT_DIR}/input/my_input.txt");
    //....
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

谢谢.

Elv*_*ira 7

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

#ifndef __CONFIG_H__
#define __CONFIG_H__

#define PROJECT_DIR @CMAKE_PROJECT_DIR@

#endif
Run Code Online (Sandbox Code Playgroud)

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

include_directories(${CMAKE_BINARY_DIR})
config_file(
    ${CMAKE_SOURCE_DIR}/config.h.in
    ${CMAKE_BINARY_DIR}/config.h
)
Run Code Online (Sandbox Code Playgroud)

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