cmake Targets:CMake如何构建简单的Target

CMake有三个基本命令,用于定义CMake Target,分别是:

  • add_executable()                                // 构建exe
  • add_library()                                       // 构建库
  • add_custom_target()                         // 自定义构建目标在camke构建阶段运行的

add_executable()

add_executable(<name> [WIN32] [MACOSX_BUNDLE]
                [EXCLUDE_FROM_ALL]
                [source1] [source2 ...])

尖括号是必须要填的方括号是表示可选的.

该命令用于定义一个可以构建可执行程序的Target.

第一个参数是Target的名字,这个参数必须提供.

第二个参数WIN32是可选的参数,Windows平台特定的参数.

第三个参数MACOSX_BUNDLE跟第二个参数类似是Mac平台特有的参数.

第四个参数EXCLUDE_FROM_ALL如果存在,那CMake默认构建的时候是不会构建这个Target.

后续source1等等,可选参数均为该构建可执行文件所需的源码.

例如:

add_executable(Tutoral ${CMAE_CURRENT_SOURCE_DIR}main/main.cpp)

我构建了一个Tutoral可执行文件,使用的源码是这个路径下的${CMAE_CURRENT_SOURCE_DIR}main/main.cpp 源码

${CMAE_CURRENT_SOURCE_DIR} 这个参数是当前cmake文件的路径.

add_library()

 add_library(<name> [STATIC | SHARED | MODULE]
             [EXCLUDE_FROM_ALL]
             [<source>...])

和add_executable()非常相似,该命令用于构建成库文件的Target.

add_library()命令支持可选的三个互斥参数: STATIC | SHARED | MODULE.这三个参数要么都不写,要么只写一个.这个三个参数的意思是STATIC(静态库),SHARED(动态库),MODULE(类似于动态库,不过不会被其他库或者可执行程序链接,用于插件式框架的软件的插件构建)

当然最佳的实践是不要自己在CMakeLists.txt中指定这几个参数,而是把主动权交给构建者,通过cmake -DBUILD_SHARED_LIBS=YES 的形式告诉其需要构建那种库.

add_custom_target()

add_custom_target(Name [ALL] [command1 [args1...]]
                   [COMMAND command2 [args2...] ...]
                   [DEPENDS depend depend depend ... ]
                   [BYPRODUCTS [files...]]
                   [WORKING_DIRECTORY dir]
                   [COMMENT comment]
                   [JOB_POOL job_pool]
                   [VERBATIM] [USES_TERMINAL]
                   [COMMAND_EXPAND_LISTS]
                   [SOURCES src1 [src2...]])

关于Target链接

Target之间在构建的时候可能会出现A依赖B,B依赖C等情况.一般这种依赖都是因为某个Target需要链接另外一个Target.用C++的知识来说就是编译器在链接阶段需要的库.

在CMake中我们使用target_link_libraries()命令来实现这一点.

target_link_libraries(<targetName> <PRIVATE | PUBLIC | INTERFACE> ... <item>... ...)

第一个参数必须指定,改名字由add_executable()或者add_libraries()命令创建的Target的名字.

后续可以接多个PRIVATE,PUBLIC,INTERFACE选项,这三个选项类似于C++类定义的private,public,protect.

这三个选项后面跟着iterms 一般是一些类库的名字,这些库由add_libraries()命令创建的Target的名字.也可以是其他方式引入的库的名字.

PRIVATE选项的含义是:targetName这个target会链接PRIVATE选项后的iterms指定的这些库,这些库只有targetName这个Target本身需要,其他任何链接这个target的其他Target都不知道这些iterms的存在.

PUBLIC选项的含义:不止targetName本身这个Target需要这些iterms,其他链接到targetName的Target也需要依赖这些iterms并链接这些iterms.

INTERFACE选项的含义:targetName本身不需要这些iterms,但是其他链接targetName的Target需要依赖这些iterms,并链接这些iterms.

最佳实践

  • 不要将Target的名字设置为${projectName}
  • 给库命名的时候避免lib前缀
  • 如果没有足够的理由,在定义库目标的时候不要使用STATIC或SHARED关键字,控制权应该交给构建时的开发者(BUILD_SHARED_LIBS)
  • target_link_libraries()总是指明PROIVATE,PUBLIC,INTERFACE
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波雅_汉库克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值