【问题标题】:Is it possible to replace certain symbol to different symbol with CMake?是否可以用 CMake 将某些符号替换为不同的符号?
【发布时间】:2015-12-16 12:34:45
【问题描述】:

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

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

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

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

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

有什么办法吗?

谢谢。

【问题讨论】:

  • 您可以使用run an arbitrary program,包括awksed 之类的处理器,甚至可以使用m4 之类的专用预处理器来预处理您的文件并进行此类替换。一个“更好”(或至少更简单)的解决方案是只定义标准 C++ 预处理器宏。
  • @JoachimPileborg 然后你的构建目录中有源文件。或者更糟糕的是,修改了源目录中的源文件。不,不,不要这样做。

标签: c++ cmake


【解决方案1】:

根据需要向源文件公开尽可能多的 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,其中包含您要从源中访问的值的定义。现在您所要做的就是:在您的 c++ 源代码中包含 config.h 并按照您的预期使用 PROJECT_DIR 宏。

【讨论】:

  • 更正:命令是 configure_file 而不是 config_file
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-03-06
      • 2012-07-01
      • 2019-03-04
      • 2021-02-01
      • 2018-07-14
      • 2014-09-07
      • 2012-01-29
      • 2015-08-25
      • 1970-01-01
      相关资源
      最近更新 更多