用于模块化c++框架的CMAKE
CMAKE for modular c++ framework
我正在重构一个独立于平台的大型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
中。
如果有什么不清楚的地方,请对这个答案发表评论。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用CMake创建QML插件
- cmake如何在fedora工作站中找到boost静态库包
- 使用CMake检测支持的C++标准
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 如何使用CMake编译.proto文件来生成.grpcp.pb.cc和.grpc.pb.h文件
- cmake在我的项目中所需的所有静态库都不成功
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 无法链接 CMake 中的本地库
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何在Ubuntu中使用cmake设置qt4
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 静态链接到 CMake 中的 macOS 框架
- 找不到cmake和osx框架
- 定位包时未设置QT的Cmake Dragndrop框架
- CMAKE Boost 单元测试框架在 Mac 上不起作用
- 如何将OpenCV的测试框架与CMake一起使用?
- 用于模块化c++框架的CMAKE