gpt4 book ai didi

c++ - 执行 cmake 目标的输出作为另一个依赖项

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:56 34 4
gpt4 key购买 nike

我有以下目录结构:

.
├── CMakeLists.txt
├── generator
│   ├── CMakeLists.txt
│   └── main.cpp
├── include
└── src
├── CMakeLists.txt
└── mylib.cpp

我想构建generator,然后使用generator 生成将用于构建mylib 的源文件。我试过这个:

生成器/CMakeLists.txt:

add_executable(gen main.cpp)

add_custom_command(
OUTPUT
${CMAKE_BINARY_DIR}/generated.cpp
DEPENDS
gen
COMMAND
${CMAKE_BINARY_DIR}/gen -d /tmp
VERBATIM
)

src/CMakeLists.txt:

add_library(py-cppast
${CMAKE_BINARY_DIR}/generated.cpp
mylib.cpp)

CMakeLists.txt:

cmake_minimum_required(VERSION 3.1.2)
project(my-project)

add_subdirectory(generator)
add_subdirectory(src)

但是,命令没有被执行。相反,我只是得到错误:

CMake Error at src/CMakeLists.txt:2 (add_library):  Cannot find source file:    /home/....(the cmake binary dir)..../generated.cpp  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp  .hxx .in .txx

如何让 cmake 执行我正在用它构建的程序?这甚至可以在单个构建中实现吗?

最佳答案

问题是因为您在一个目录中生成文件 generated.cpp,然后尝试将其添加到在不同目录中定义的目标。 CMake 仅支持将生成的文件添加到在相同 目录范围内定义的目标。 add_custom_command()文档明确提到了此限制。

您可能希望将 generated.cpp 的生成移动到 src 目录中。您还应该只使用 gen 目标名称来引用要运行的可执行文件,而不是 ${CMAKE_BINARY_DIR}/gen 这对所有 CMake 生成器类型都不正确.使用当前二进制目录而不是顶级二进制目录作为输出目录也是更好的风格。您的 src/CMakeLists.txt 应如下所示:

add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated.cpp
DEPENDS gen
COMMAND gen -d /tmp
VERBATIM
)
add_library(py-cppast
${CMAKE_CURRENT_BINARY_DIR}/generated.cpp
mylib.cpp
)

CMake 会自动为您替换 gen 目标的位置,即使它是在不同的目录中定义的。在使用生成的源代码时,需要注意一些更细微的细节,尤其是与依赖项相关的细节。你可能会发现 this article有助于填补一些空白。

关于c++ - 执行 cmake 目标的输出作为另一个依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43836698/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com