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

时间:2015-08-10 11:23:11

标签: visual-studio cmake

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

目前,我知道在CMake中执行此操作而没有每个文件夹的库的唯一方法是按照通常的方式列出文件及其相对路径:

add_library(SystemAbstraction STATIC "Some/Path/File.cpp")

然而,随着项目规模的扩大和所有不同的路径,我可以看到这种方式变得笨拙。

我试着看看每个文件夹中是否有CMakeLists.txt,并且在添加库依赖项时只使用基本CMakeLists.txt中的变量。但似乎add_subdirectory也不导入变量?

2 个答案:

答案 0 :(得分:1)

要在子目录中扩展变量的范围,请使用PARENT_SCOPE的{​​{1}}选项。例如,如果您有

,则可以测试
set

在根目录和

# CMakeLists.txt
set(SRCS main.c)
add_subdirectory(foo)
message(${SRCS})

在子目录中然后它会打印# foo/CMakeLists.txt set(SRCS ${SRCS} foo.c PARENT_SCOPE) ,即该变量被正确导入基础CMakeLists.txt。

答案 1 :(得分:1)

一个选项是使用CMake的对象库功能。您仍然可以但不需要将CMake脚本组织到子目录中:

add_library(lib1 OBJECT <srcs>)
add_library(lib2 OBJECT <srcs>)
...
add_library(mainlib $<TARGET_OBJECTS:lib1> $<TARGET_OBJECTS:lib2>)

您可以为每个对象库设置不同的编译标志:

target_include_directories(lib1 PRIVATE incl-dir-for-lib1)
target_compile_definitions(lib2 PRIVATE def-for-lib2)

您仍需要在主库中设置链接库:

target_link_libraries(mainlib PRIVATE deps-of-lib1 deps-of-lib2)

相关文档:Object Libraries

相关问题