我有以下目录结构:
.
├── CMakeLists.txt
├── generator
│ ├── CMakeLists.txt
│ └── main.cpp
├── include
└── src
├── CMakeLists.txt
└── mylib.cpp
我想构建 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执行我正在构建的程序?这在单一构建中是否可行?
1 回答
问题来自于您在一个目录中生成文件
generated.cpp
然后尝试将其添加到在不同目录中定义的目标 . CMake仅支持将生成的文件添加到在同一目录范围中定义的目标 . add_custom_command()文档明确提到了这一限制 .您可能希望将
generated.cpp
的生成移动到src
目录中 . 您还应该仅使用gen
目标名称来引用要运行的可执行文件,而不是${CMAKE_BINARY_DIR}/gen
,这对于所有CMake生成器类型都不正确 . 使用当前二进制目录而不是顶级二进制目录作为输出目录也是更好的方式 . 你的src/CMakeLists.txt
应该是这样的:CMake会自动替换
gen
目标的位置,即使它是在不同的目录中定义的 . 使用生成的源时需要注意一些细微之处,特别是与依赖关系有关 . 您可能会发现this article有助于填补一些空白 .