用于模块化c++框架的CMAKE

CMAKE for modular c++ framework

本文关键字:CMAKE 框架 c++ 模块化 用于      更新时间:2023-10-16

我正在重构一个独立于平台的大型c++框架,这样它的库和可执行程序就不必再位于同一目录(甚至存储库)中,事实证明这非常具有挑战性。该框架目前只有我一个人使用,现在应该针对我们整个工作组,所以我必须尽可能地保持模块化和自动化。

我的基本结构看起来像这个

  • 应用程序/
    • app1、app2
  • libs/
    • 核心,lib1,lib2
  • 垃圾箱:
    • app1、app2、libcore、liblib1、liblib2。。。(在NIX上)
    • app1.exe、app2.exe、core.dll、lib1.dll、lib2.dll…(在Windows上)

应用程序依赖于,所有库都依赖于核心库。这一切在同一根目录中运行良好,并使用add_subdirectory机制。

项目依赖关系是按照我调用add_subdirectory的顺序处理的:首先是libs(核心是第一个),然后是应用程序。Cmake足够善良,可以将${core_SOURCE_IR}设置到相应的目录中,并且所有二进制文件(库和应用程序)都在同一目录中生成。

我需要的建议是:

  • 我应该转向基于find_package的方法吗(为每个lib和FindLib.cmake文件编写)
  • 应用程序将如何找到彼此
  • 二进制文件放在哪里
  • 如何传递依赖目标的include目录
  • 是否添加ExternalProject_Add

感谢

我建议使用INSTALL(TARGETS...INSTALL(EXPORT...

有关详细信息,请运行:

cmake --help-command INSTALL

FIND_PACKAGE通常用于查找已安装的外部项目(未使用CMake的INSTALL(EXPORT...命令安装),ExternalProject_Add用于下载、配置、构建和安装外部项目。

如果您将INSTALL(EXPORT...与每个lib和ex一起使用,然后在主CMakeLists.txt中仅使用INCLUDE(已安装的<target>.cmake),则这些将作为适当的CMake目标可用,并且已经设置了每个配置的依赖关系。

至于在哪里安装这些导出文件,这取决于您,但只要您指定的路径与稍后INCLUDE文件时使用的路径相同,它就应该可以正常工作。

首先,您可以按任何顺序add_subdirectory()es,而不必关心依赖关系。CMake在解析所有CMakeLists.txt时处理它们。

其次,如果您希望任何lib或应用程序都是可独立构建的,那么您当然应该使用类似find_package()的东西。对于简单的情况,它可以是find_library()find_file(lib.h)

在这种情况下,find_package()调用后,您将定义LIB_INCLUDE_DIRS、LIB_LIBRARY_DIRS和LIB_LIBRARIES变量,这些变量可以分别传递给include_directories()link_directories()target_link_libraries()。这就是应用程序查找库的方式。

至于将二进制文件放在*NIX中的位置,通常将它们放在${CMAKE_INSTALL_PREFIX}/bin中。

如果有什么不清楚的地方,请对这个答案发表评论。