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

时间:2015-12-16 12:34:46

标签: c++ cmake

我试图用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");
    //....
}

有没有办法做到这一点?

感谢。

3 个答案:

答案 0 :(得分:7)

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

<table bgcolor="#ffffff" align="center" border="0" style="width:600px;border: 1px solid #cccccc"></table>

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

#ifndef __CONFIG_H__
#define __CONFIG_H__

#define PROJECT_DIR @CMAKE_PROJECT_DIR@

#endif

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

答案 1 :(得分:4)

不,CMake不能直接这样做。你不应该这样做,因为你必须将你的源代码放在你的构建目录而不是源目录中。

关于C ++和CMake的常用方法是在C ++代码中使用宏FOO_PATH并且

  1. 通过-DFOO_PATH=<path_to_foo> via CMake
  2. 在您的configure file config.h中添加一个定义#cmakedefine FOO_PATH FOO_PATH,在您的CMake代码中定义FOO_PATH,然后重新生成您的配置。

答案 2 :(得分:0)

在使用 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”