我试图用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");
//....
}
有没有办法做到这一点?
感谢。
答案 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
并且
-DFOO_PATH=<path_to_foo>
via CMake。#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”