Visual studio CMake在不滥用库的情况下进行分层项目管理
我有一个项目,其中只有少数几个逻辑分组用于生成静态库。不过,为了方便起见,我希望使用更细粒度的文件夹来管理库的源代码 目前,我所知道的在CMake中执行此操作而无需为每个文件夹创建库的唯一方法是只列出文件,就像您通常在中列出的那样,以及它们的相对路径:Visual studio CMake在不滥用库的情况下进行分层项目管理,visual-studio,cmake,Visual Studio,Cmake,我有一个项目,其中只有少数几个逻辑分组用于生成静态库。不过,为了方便起见,我希望使用更细粒度的文件夹来管理库的源代码 目前,我所知道的在CMake中执行此操作而无需为每个文件夹创建库的唯一方法是只列出文件,就像您通常在中列出的那样,以及它们的相对路径: add_library(SystemAbstraction STATIC "Some/Path/File.cpp") 然而,我可以看到,随着项目规模的不断扩大,所有不同的路径越来越复杂 我试图查看是否可以在每个文件夹中都有一个CMakeList
add_library(SystemAbstraction STATIC "Some/Path/File.cpp")
然而,我可以看到,随着项目规模的不断扩大,所有不同的路径越来越复杂
我试图查看是否可以在每个文件夹中都有一个CMakeLists.txt,并且在添加库依赖项时只使用基本CMakeLists.txt中的一个变量。但是add_subdirectory似乎并不同时导入变量?要扩展子目录中变量的范围,请使用
set
的PARENT_scope
选项。例如,如果您有
# CMakeLists.txt
set(SRCS main.c)
add_subdirectory(foo)
message(${SRCS})
在根目录和
# foo/CMakeLists.txt
set(SRCS ${SRCS} foo.c PARENT_SCOPE)
在子目录中,它将打印
main.cfoo.c
,也就是说,变量被正确导入到基本的CMakeLists.txt中。一个选项是使用CMake的对象库功能。您仍然可以但不需要将CMake脚本组织到子目录中:
add_library(lib1 OBJECT <srcs>)
add_library(lib2 OBJECT <srcs>)
...
add_library(mainlib $<TARGET_OBJECTS:lib1> $<TARGET_OBJECTS:lib2>)
您仍然需要在主库上设置链接库:
target_link_libraries(mainlib PRIVATE deps-of-lib1 deps-of-lib2)
相关文档:这是否适用于任何深度?或者我需要为每个父文件夹执行此操作。作用域仅向上传播一个级别。在中间级别的CMakeLists.txt中,您至少需要设置
set(SRCS${SRCS}PARENT_SCOPE)
,它前面应该有任何add_子目录
命令。
target_link_libraries(mainlib PRIVATE deps-of-lib1 deps-of-lib2)