我正在尝试让另一个人的研究代码重现,以便其他人不会遇到我现在遇到的同样的问题。但是,我缺乏cmake的经验。这是我在阅读文档后可以做的事情:
在与我的CMakeLists.txt
相同的文件夹中,我有一个名为io_utils.h
的文件,其中ROOT_PATH
变量的值为VALUE_ROOT_PATH
。
我想用文件的当前目录的值替换该字符串。所以我尝试将以下内容添加到CMakeLists.txt
:
# Set ROOT_PATH in io_utils.h
FIND_PATH(BUILD_PATH CMakeLists.txt . )
FILE(READ ${BUILD_PATH}io_utils.h IO_UTILS)
STRING(REGEX REPLACE "VALUE_ROOT_PATH" "${BUILD_PATH}" MOD_IO_UTILS "${IO_UTILS}" )
FILE(WRITE ${BUILD_PATH}io_utils.h "${MOD_IO_UTILS}")
我尝试制作并安装它但它无法正常工作,文件未更改。我做了什么错了?
答案 0 :(得分:11)
我建议使用configure_file
cmake宏的不同方法。首先,创建一个模板文件,该文件引用您计划在cmake中设置的任何变量,然后宏将实际值替换为变量。例如,假设我们有一个模板文件io_utils.h.in
,如下所示:
const char* ROOT_PATH = "${BUILD_PATH}";
在CMakeLists.txt
中,您可以执行以下操作:
configure_file( io_utils.h.in io_utils.h )
当您运行cmake
时,它将使用第一个文件作为模板(此处为io_utils.h.in
)生成第二个文件(此处称为io_utils.h
),其值替换为:< / p>
const char* ROOT_PATH = "/path/to/CMakeLists.txt";
顺便说一下,CMake有一个内置变量,它引用了名为CMakeLists.txt
的顶级CMAKE_SOURCE_DIR
的目录。尝试使用此变量替换上面的BUILD_PATH
。
答案 1 :(得分:1)
在这种情况下,定义宏并让预处理器完成工作似乎要容易得多:
add_definition(ROOT_PATH ${VALUE_ROOT_PATH})