当前位置: 首页 > 知识库问答 >
问题:

CMake中库间的重叠依赖关系

乌翔
2023-03-14

假设有以下目录结构:

projects
   |
   +--lib1
   |   |
   |   +-CMakeFiles.txt
   |
   +--lib2
   |   |
   |   +-CMakeFiles.txt
   |
   +--test
       |
       +-CMakeFiles.txt
cmake_minimum_required(VERSION 2.0)

add_library(lib1 STATIC lib1.cpp)
cmake_minimum_required(VERSION 2.0)

add_subdirectory(../lib1 ${CMAKE_CURRENT_BINARY_DIR}/lib1)
add_library(lib2 STATIC lib2.cpp)
target_link_libraries(lib2 lib1)
cmake_minimum_required(VERSION 2.0)
project(test)

add_subdirectory(../lib1 ${CMAKE_CURRENT_BINARY_DIR}/lib1)
add_subdirectory(../lib2 ${CMAKE_CURRENT_BINARY_DIR}/lib2)

add_executable(test main.cpp)
target_link_libraries(test lib1 lib2)

即。lib2依赖于lib1test依赖于这两者。(我知道静态库在技术上不“链接”,但这只是一个例子。)

问题是,在当前的设置中,lib1会编译两次--第一次在“test”构建目录中,第二次在“test/build_directory/lib2/build_directory”中。我想避免这种情况。

顶级的cmakelists.txt文件不是一个选项,因为我希望保持一个干净的顶级目录,并且能够在其他项目中包含库,这些库可以位于其他地方。因为是Windows,我不能“在系统范围内安装包”--我不想失去动态切换编译器的能力。用不同的编译器构建的实用程序库将使用不同的C运行时库/ABI,因此将是不兼容的。

共有1个答案

利永年
2023-03-14

对于CMake,库依赖关系是可传递的,因此您不应该在test/cmakefiles.txt中调用add_subdirectory两次(也不需要将lib1作为test的依赖关系列出,因为它已经是lib2的依赖关系)。

因此可以将test的cmakefiles.txt修改为:

cmake_minimum_required(VERSION 2.8.7)  # Prefer the most current version possible
project(test)

add_subdirectory(../lib2 ${CMAKE_CURRENT_BINARY_DIR}/lib2)

add_executable(test main.cpp)
target_link_libraries(test lib2)

此外,您可能应该从非项目cmakefiles.txt文件(lib文件)中删除cmake_minimum_required调用。有关进一步信息,请运行:

cmake --help-policy CMP0000

export将创建一个文件,该文件可以是其他项目的included,并将目标导入调用include的项目中。

install可以将库安装到projects/的另一个公共子目录中。根据源目录结构的不同,这样做的好处是只使所需的库API标头可用于相关项目。

但是,这两个选项都要求在修改依赖库项目时重新生成(并安装)它们,而当前的设置包括项目中的所有依赖目标,因此对依赖库中源文件的任何更改都将导致test目标过期。

cmake --help-command export
cmake --help-command install
 类似资料:
  • 我有以下项目结构: cmakelists.txt lib1/cmakelists.txt以及lib的所有cpp和头文件 lib2/cmakelists.txt以及lib的所有cpp和头文件 app/cmakelists.txt和应用程序的所有cpp和头文件 它生成了我想要的源代码外的VS.sln文件,但是应用程序不能编译,因为它找不到lib1的头文件(显然)。 现在,我阅读并尝试了许多方法,比如(

  • 我将描述我的CMake项目目前是如何安排的。现在还早,所以欢迎提出更好的安排。 顶级 lib1 lib2 我在每个级别上都有cmakelists.txt。 在Lib1 I add_library(STATIC)中,然后使用Lib2 target_link_library,它也是静态的。 lib2的cmakelists.txt执行对Qt5Widgets、Qt5Core和qt5gui的find_pac

  • 当我将触发helm install命令时,helm将读取所有的yml,因此将尝试一次部署所有的pods,这是我不想要的。我希望我的工作首先成功,然后只有其他的吊舱应该开始部署。当作业正在运行时,所有其他POD都应该等待或不应该启动,因为它们都依赖于作业的成功。 我怎样才能用Helm完成这个案子。请建议。我如何让其他豆荚等待,让他们知道工作已经成功地完成了。

  • 问题内容: 我需要找到函数/过程(在包体内定义)和它们使用的表之间的依赖关系。 我试过了,但它仅在包级别有效,而在内部功能/过程级别无效。是否有可能使用eg找到这种依赖关系? 在此先感谢您的帮助。 问题答案: 无法找到过程(在包中)和表之间的依赖关系。 有几种工具可以检查依赖关系。正如您已经发现的那样,仅在每个包级别上跟踪对象依赖关系。有一个整洁的工具PL / Scope 可以跟踪软件包各部分之间

  • 我想将审核更改持久化到oracle db。micro服务是一个带有hibernate的Spring Boot应用程序。我在javers的mvn存储库链接中发现了许多依赖项 我应该为oracle db使用哪个依赖项?

  • 问题内容: 我有具有main.c main.h和CMakeLists.txt的示例程序目录 main.h的内容是 main.c的内容是 和CMakeLists.txt 但是cmake不会在修改头文件时重建main.c。我希望它自动生成头文件依赖项。有可能使用cmake吗? 如果没有,还有其他工具可以做到吗? 问题答案: 如我的评论中所述,我已经尝试了您的示例,并且一切正常:如果进行了修改,则将重新