Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio CMake在不滥用库的情况下进行分层项目管理_Visual Studio_Cmake - Fatal编程技术网

Visual studio CMake在不滥用库的情况下进行分层项目管理

Visual studio CMake在不滥用库的情况下进行分层项目管理,visual-studio,cmake,Visual Studio,Cmake,我有一个项目,其中只有少数几个逻辑分组用于生成静态库。不过,为了方便起见,我希望使用更细粒度的文件夹来管理库的源代码 目前,我所知道的在CMake中执行此操作而无需为每个文件夹创建库的唯一方法是只列出文件,就像您通常在中列出的那样,以及它们的相对路径: add_library(SystemAbstraction STATIC "Some/Path/File.cpp") 然而,我可以看到,随着项目规模的不断扩大,所有不同的路径越来越复杂 我试图查看是否可以在每个文件夹中都有一个CMakeList

我有一个项目,其中只有少数几个逻辑分组用于生成静态库。不过,为了方便起见,我希望使用更细粒度的文件夹来管理库的源代码

目前,我所知道的在CMake中执行此操作而无需为每个文件夹创建库的唯一方法是只列出文件,就像您通常在中列出的那样,以及它们的相对路径:

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)