CMake 中的依赖兄弟子目录
Dependent sibling subdirectories in CMake
我当前的项目结构如下:
root
|- parser
| |- include // a directory for headers
| |- src // a directory for sources
| |- parser.yy
| |- scanner.ll
| |- CmakeLists.txt
|
|- preprocessor
| |- include // a directory for headers
| |- src // a directory for sources
| |- CmakeLists.txt
|
|- main.cpp
|- CMakeLists.txt
现在我要开始生成汇编代码了。我必须在 parser.yy
和 [=15= 的 src
文件夹中使用 staticstack
和 codegen
(即将定义的 类) ] 福勒.
我不知道该怎么做。
在 CMake 中执行此操作的最佳做法是什么?
- 我应该在
parser
文件夹中创建名为 semstack
和 codegen
的子目录吗?这对我来说似乎不正确,因为随着 CMake 项目变得更大,层次结构将变得更深,如果有更多的依赖关系,那将是一团糟。
- 我应该在根目录下创建这些子目录吗?如果那么 CMake 中使用同级子目录的语法是什么?
If then what is the syntax in CMake to use sibling subdirectory ?
因为普通(即不是 IMPORTED
)目标是全局的,所以没有特殊的语法。如果您在一个子目录中定义了一个库,则可以通过 target_link_libraries
.
在任何其他子目录中使用它
例如:
# parser/CMakeLists.txt
add_library(parser ...)
add_library(proj::parser ALIAS parser)
target_include_directories(
parser PRIVATE "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
target_link_libraries(
parser PRIVATE proj::semstack proj::codegen)
其他子目录的代码类似。
# ./CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(proj)
add_subdirectory(semstack)
add_subdirectory(codegen)
add_subdirectory(parser)
add_subdirectory(preprocessor)
add_executable(main main.cpp)
target_link_libraries(
main PRIVATE proj::parser proj::preprocessor)
我创建 link 到 ALIAS
目标以避免目标名称中的拼写错误被逐字转发给 linker(CMake 中带有 ::
的名称是总是 考虑目标,这在生成时得到验证)。
我当前的项目结构如下:
root
|- parser
| |- include // a directory for headers
| |- src // a directory for sources
| |- parser.yy
| |- scanner.ll
| |- CmakeLists.txt
|
|- preprocessor
| |- include // a directory for headers
| |- src // a directory for sources
| |- CmakeLists.txt
|
|- main.cpp
|- CMakeLists.txt
现在我要开始生成汇编代码了。我必须在 parser.yy
和 [=15= 的 src
文件夹中使用 staticstack
和 codegen
(即将定义的 类) ] 福勒.
我不知道该怎么做。
在 CMake 中执行此操作的最佳做法是什么?
- 我应该在
parser
文件夹中创建名为semstack
和codegen
的子目录吗?这对我来说似乎不正确,因为随着 CMake 项目变得更大,层次结构将变得更深,如果有更多的依赖关系,那将是一团糟。 - 我应该在根目录下创建这些子目录吗?如果那么 CMake 中使用同级子目录的语法是什么?
If then what is the syntax in CMake to use sibling subdirectory ?
因为普通(即不是 IMPORTED
)目标是全局的,所以没有特殊的语法。如果您在一个子目录中定义了一个库,则可以通过 target_link_libraries
.
例如:
# parser/CMakeLists.txt
add_library(parser ...)
add_library(proj::parser ALIAS parser)
target_include_directories(
parser PRIVATE "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
target_link_libraries(
parser PRIVATE proj::semstack proj::codegen)
其他子目录的代码类似。
# ./CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(proj)
add_subdirectory(semstack)
add_subdirectory(codegen)
add_subdirectory(parser)
add_subdirectory(preprocessor)
add_executable(main main.cpp)
target_link_libraries(
main PRIVATE proj::parser proj::preprocessor)
我创建 link 到 ALIAS
目标以避免目标名称中的拼写错误被逐字转发给 linker(CMake 中带有 ::
的名称是总是 考虑目标,这在生成时得到验证)。