是否可以用CMake将某个符号替换为不同的符号
Is it possible to replace certain symbol to different symbol with 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");
//....
}
有办法做到这一点吗?
谢谢。
向源文件公开尽可能多的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,其中包含要从源访问的值的定义。现在您所要做的就是:将config.h包含在您的c++源代码中,并按预期使用PROJECT_DIR宏。
否,CMake不能直接执行此操作。您不应该这样做,因为您必须将源代码放在构建目录中,而不是放在源目录中。
对于C++和CMake,通常的方法是在C++代码和中使用宏FOO_PATH
- 通过CMake传递CCD_ 3
- 在配置文件config.h中添加define
#cmakedefine FOO_PATH FOO_PATH
,在CMake代码中定义FOO_PATH,然后重新生成配置
使用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";
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 用符号版本替换对函数的所有调用
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何在给定文本中用字符数组替换符号
- C++ 如果要替换的句子具有"+"符号,则替换字符串功能不起作用
- 在编译时替换对象文件中的符号.例如,换掉main
- LD_PRELOAD应该加载模块还是只使用模块来替换符号
- 用字符串中的空格替换符号
- 使用指针将输入中的空格替换为破折号符号
- 如何查找字符串中的所有字符并将其替换为特定符号C++
- 将符号替换为表达式中的值并打印表达式输出
- 将 const 无符号字符* 分配给执行就地替换或省略的 std::string
- 如何有效地替换C++中的德语变音符号
- 是否可以用CMake将某个符号替换为不同的符号
- 链接器用内存地址替换符号引用
- 将正有符号变量替换为无符号变量
- 当一个符号替换几个符号时,是否存在从UTF-8到CP1251的音译?