C++ 如何在执行过程中使用文件结果(全局递归)?
我现在被CMake弄得精神崩溃。首先让我向您展示我正在进行的工作:C++ 如何在执行过程中使用文件结果(全局递归)?,c++,cmake,C++,Cmake,我现在被CMake弄得精神崩溃。首先让我向您展示我正在进行的工作: FILE( GLOB_RECURSE FLATBUFFER_SRC "*.fbs" ) STRING( REPLACE ";" " " FLATBUFFER_SRC_STR "${FLATBUFFER_SRC}" ) SET( FLATC_COMMAND "flatc --cpp --gen-mutable -o ${META_INSTALL_LOCATION} ${FLATBUFFER_SRC_STR}" ) MESSAGE
FILE( GLOB_RECURSE FLATBUFFER_SRC "*.fbs" )
STRING( REPLACE ";" " " FLATBUFFER_SRC_STR "${FLATBUFFER_SRC}" )
SET( FLATC_COMMAND "flatc --cpp --gen-mutable -o ${META_INSTALL_LOCATION} ${FLATBUFFER_SRC_STR}" )
MESSAGE( STATUS "${FLATC_COMMAND}" )
EXECUTE_PROCESS(
COMMAND ${FLATC_COMMAND}
RESULT_VARIABLE OUT
)
IF ( NOT ${OUT} EQUAL "0" )
MESSAGE( STATUS "COMMAND EXIT WITH: ${OUT}" )
MESSAGE( STATUS "META_INSTALL_LOCATION: ${META_INSTALL_LOCATION}" )
MESSAGE( STATUS "FLATBUFFER_SRC_STR: ${FLATBUFFER_SRC_STR}" )
MESSAGE( FATAL_ERROR "flatc has FAILED gracefully" )
ENDIF ()
这是一个输出:
——flatc--cpp--gen mutable-o/home/black/Work/hubris/meta/home/black/Work/hubris/cmake build debug/meta prefix/src/meta/fbs/game/base.fbs/home/black/Work/hubris/cmake build debug/meta prefix/src/meta/fbs/game/util/vec.fbs
--配置完成
--命令退出:没有这样的文件或目录
--META\u安装位置:/home/black/Work/hubris/META
--FLATBUFFER_SRC_STR:/home/black/Work/hubris/cmake build debug/META prefix/SRC/META/fbs/game/base.fbs/home/black/Work/hubris/cmake build debug/META prefix/SRC/META/fbs/game/util/vec.fbs
CMakeLists.txt:20处的CMake错误(消息):
弗拉特失败了
虽然我的问题是“为什么它不起作用?”并且它将保持不变,但我希望了解CMake的方法。在shell打印命令中运行时:
flatc --cpp --gen-mutable -o /home/black/Work/hubris/meta /home/black/Work/hubris/cmake-build-debug/META-prefix/src/META/fbs/game/base.fbs /home/black/Work/hubris/cmake-build-debug/META-prefix/src/META/fbs/game/util/vec.fbs
它就像一场梦。我真的很困惑,浪费了很多时间。
谁能向我解释一下,我做错了什么?文件(GLOB\u RECURSE)的结果是一个列表,当您为命令指定参数时,CMake正好需要一个列表。因此,只需将此列表传递给execute\u process
,无需任何修改和引用:
或者,通过删除中间FLATC_命令
变量:
FILE( GLOB_RECURSE FLATBUFFER_SRC "*.fbs" )
EXECUTE_PROCESS(
COMMAND flatc --cpp --gen-mutable -o ${META_INSTALL_LOCATION} ${FLATBUFFER_SRC}
RESULT_VARIABLE OUT
)
不要为FLATC_命令
变量引用整个值。这与在shell中引用整个命令行相同:“flatc--cpp--gen mutable…”
-shell将整个字符串解释为命令名,如果没有这样的文件或目录,则会失败。
。嗨!虽然我同意你指出的问题是类似的,但我个人认为这并不能解决我的问题。我确实看到过那个帖子,但它并没有回答我的。。。问题?出于某种原因,当我执行时:EXECUTE\u进程(命令flatc--cpp--gen mutable-o${META\u INSTALL\u LOCATION}${FLATBUFFER\u SRC\u STR})
它仍然将${FLATBUFFER\u SRC\u STR}
作为一个参数。。。你能帮我一下吗?我无法理解如何告诉CMake将此列表解压缩为args。啊,而且flatc确实知道有一个arg,他无法解析(这个信息可能会有帮助)。泰!您可以从文件(GLOB)
获取FLATBUFFER\u SRC
。在FLATC\u命令
变量的设置中使用此变量,不进行任何替换(删除STRING(REPLACE)
行)并引用:SET(FLATC\u命令FLATC--cpp--gen mutable--o${META u安装位置}${FLATBUFFER\u SRC})
。从您的评论中,我理解“核心”问题,因此我更新了标题以反映它。虽然这个“核心”问题与重复问题密切相关,但我认为它值得单独提问/回答。我没有发现关于堆栈溢出的相同(更新!)问题的问题,所以我重新打开了这个问题。非常直截了当,我忽略了列表中的事实。我真的很感谢你的帮助!
FILE( GLOB_RECURSE FLATBUFFER_SRC "*.fbs" )
EXECUTE_PROCESS(
COMMAND flatc --cpp --gen-mutable -o ${META_INSTALL_LOCATION} ${FLATBUFFER_SRC}
RESULT_VARIABLE OUT
)