我正在尝试用CMake制作一个可执行文件.此可执行文件需要位于项目中的文件的完整路径.
int main() { std::ifstream("fullpath_to_file"); //.... }
我认为如果CMake可以用用户指定的字符串替换源代码中的某些符号,则不需要硬编码完整路径.
例如,如果CMake可以将${CMAKE_PROJECT_DIR}
源代码(cpp)替换为cmake的变量,如$ {PROJECT_SOURCE_DIR},那么我就可以像这样编写源代码.
int main() { std::ifstream("${CMAKE_PROJECT_DIR}/input/my_input.txt"); //.... }
有没有办法做到这一点?
谢谢.
根据需要向源文件公开尽可能多的CMake变量的好方法是为项目创建配置标头.首先,为标题创建一个模板,称之为config.h.in并定义CMake在构建时设置的符号,例如config.h的内容.在你的情况下可以是
#ifndef __CONFIG_H__ #define __CONFIG_H__ #define PROJECT_DIR @CMAKE_PROJECT_DIR@ #endif
然后在CMakeLists.txt中添加一条指令来更改此配置标头,并将@s之间的值替换为相应的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宏.