从Target 角度看 CMake (一)CMake 中的Target

        Target 是CMake 中非常重要的概念,CMake中的大部分操作都是围绕Target 展开的,也许因为它太重要了,CMake 把它包装得特别好,以至于一般的小型项目中,开发人员甚至都不需要考虑Target 的概念就可以完成项目的开发。对于稍微大一点儿的项目则不同,充分与灵活地使用Target 概念可以为开发过程带来很多的方便,有些情况下,没有Target 甚至是不行的。

        本系列文章以Target 为中心来介绍CMake 的各项功能, 并按照Target 的应用场景来组织文章的内容。

 Target 的几种典型应用场景

        按照CMake 的文档,从概念上讲一共有三种类型的Target: executable, library, custom_target,那么在什么情况下使用custom_target 的呢?如果从场景上讲,就好理解多了,下面介绍几个典型的Target 应用场景。

  1. 可执行程序 (add_executable)
  2. 库 (add_library)
  3. 引入的库 (find_package)
  4. 获取的内容(FetchContent)
  5. 测试 (CTest)
  6. 文档
  7. 安装程序 (CPack)

应用程序

        可执行程序可能是最常用的Target 了,对于软件项目来讲,可执行程序往往是最重要的目标。一个项目可能会生成多个可执行程序。每一个可执行程序就是一个单独的Target。在后面的文章中,我会介绍如何为同一个项目下的不同Target 指定不同的include_directories 与 library_directories 以及如何只编译某一个可执行程序。

        一个可执行程序往往会依赖很多库,现在说的库是指用项目中的源代码编译出来的库,也就是通过 add_library 来生成的库。

        这样生成的库既可以被应用程序使用,也可以被项目中其它的库所使用 (target_link_libraries)。这样就带来了库的依赖关系问题。有些库还可以被其它的项目使用,如何让其它项目的CMake 找到它并利用它也是本系列文章要介绍的内容之一。

        实际上不仅库与应用程序之间、库与库之间有依赖关系。应用程序、库、文档、测试、安装程序之间也有着复杂的依赖关系,这时就体现出Target 的灵活性与必要性。

引入的库

        引入的库(imported library)是指通过 find_package 引入到系统中的外部库。这些库可能是通过安装程序直接安装的二进制文件,也可能是在另一个项目中编译生成的文件。

        在CMake 关于Target 的介绍中,并没有明确指出引用的库也是Target,既然库是Target,那引入的库也应该是Target 了。

        如果库是通过项目中的源代码生成的,那依赖它的应用程序会与它使用同样的配置(--config)来编译与连接。比如 --config=release, 那么库与应用程序同样是按release 方式进行编译;而--config=debug 则同时使用debug 方式进行编译与连接。

        如果库是从外部引用的,那在连接的时候 release 版的程序要连接release 版的库,debug版的应用程序要连接debug 版的库,通常debug的库文件名称以d结尾,如opencv_world_440d.dll。这个时候在写 target_link_libraries 时就要写引入库的别名而不是文件名,这样CMake 就可以自动选择对应的版本进行连接了。

获取的内容(FetchContent)

        理论上讲FetchContent 与 find_package 找到的库一样,也是外部库,当然也是一种Target了。不同的是,find_package 引用的库在执行CMake 命令之前都已经编译好配置好,而FetchContent 则是先下载源代码,再编译,然后被项目中的其它Target 引用,这个其它Target 也包括其它FetchContent 获取的Target,也就是说它们之间也有一定的依赖关系。

测试

        测试也是一种Target,你可以使用CMake 自带的CTest 也可以使用Google 的gtest 或者其它的测试工具编译自己的测试源代码并通过CMake 对编译环境进行设置。

        测试虽然也是可执行程序的一种,但是它与可执行程序最大的不同是:它不仅需要被编译与连接,还需要被运行,以便检验被测试程序是否正确地实现了它的功能。

        显然测试严重依赖被测试的Target,只有被测试的Target 编译成功之后测试Target 才会被执行。

文档

        这里讲的文档是指随项目同时发行的文档,比如通过Doxygen 生成的文档,或者通过 Tex 编译出来的 pdf 文件等内容,这些内容可以随build 一起构建,也可以自行构建。

安装程序

        安装程序也可以作为一个Target 由CMake 进行配置,并进行Build。本系列将介绍 利用CMake 自己提供的方式构建安装程序,也会介绍通过自定义命令制作特定类型的安装程序。

从Visual Studio 的角度理解CMake 项目与Target

        如果从Visual Studio 的角度来看CMake,那么CMake 中的project 对应Visual Studio 中的Solution,而CMake 中的Target 对应 Visual Studio 中的Project。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值