cmake(2):编译可执行文件的简单sample

1. 说明

本篇将以一个极简的hello程序说明CMakeLists.txt的基本用法。

2. 示例

2.1 编写测试源程序

//hello.cpp
#include <iostream>

int main()
{
    std::cout << "Hello, this is my first cmake sample" << std::endl;

    return 0;
}

2.2 编写CMakeLists.txt

#CMakeLists.txt
cmake_minimum_required (VERSION 3.0.0)
project (cmake_test VERSION 0.0.1)

add_executable (test hello.cpp)

2.3 编译

$cmake .

-- The C compiler identification is GNU 5.5.0
-- The CXX compiler identification is Clang 3.8.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/clang++
-- Check for working CXX compiler: /usr/bin/clang++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xxx/cmake

运行上述命令后会在当前目录下生成一系列cmake*文件和一个Makefile文件,这个Makefile就是cmake自动产生的下一步编译所需的编译规则文件。

$make

Scanning dependencies of target test
[ 50%] Building CXX object CMakeFiles/test.dir/hello.cpp.o
[100%] Linking CXX executable test
[100%] Built target test

编译完成,从log信息中可以看出生成可执行的目标文件test

2.4 运行

$./test
Hello, this is my first cmake sample

3. 命令解析

3.1 cmake_minimum_required

cmake_minimum_required是cmake的一个command,其设置项目的最低的cmake版本要求。如果实际环境的cmake版本小于该命令的设置,则报错。
这个命令通常是必要的,且在CMakeLists.txt文件的一开始就使用。(如果有多层目录,那么子目录下的文件可以不要)

用法如下:

cmake_minimum_required(VERSION <min>[...<max>] [FATAL_ERROR])
  • VERSION:关键字,必需且保持不变;
  • min : 指定的cmake最低版本,实际运行环境的cmake必须不小于这个版本,通常说明编译文件使用到了哪个版本的特性。
  • max : 可选,用于指定最高的cmake版本,如果设置,则必须不小于min且可能会影响cmake_policy的设置,此选项在3.12版本后才添加
    min, max均遵循cmake的版本格式:major.minor[.patch[.tweak]]
  • FATAL_ERROR : 可选,在cmake2.6之后就不再使用,保留它仅仅为了兼容低版本的命令。

3.2 project

project命令设置项目的名称,并将其保存在变量PROJECT_NAME中。如果是顶层CMakeLists.txt,还将项目名称存储在变量CMAKE_PROJECT_NAME中。
后面就可以直接用{PROJECT_NAME}或{CMAKE_PROJECT_NAME}命令来获取项目名称。
这个命令在一个项目的CMakeLists.txt中也是必要的。

用法:

project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
        [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
        [DESCRIPTION <project-description-string>]
        [HOMEPAGE_URL <url-string>]
        [LANGUAGES <language-name>...])
  • PROJECT-NAME:项目名称
  • VERSION:如同软件版本号,说明项目版本,可选。如果使用,CMP0048必须设置为NEW,同时版本号会保存在以下变量中:

PROJECT_VERSION, PROJECT-NAME_VERSION
PROJECT_VERSION_MAJOR, PROJECT-NAME_VERSION_MAJOR
PROJECT_VERSION_MINOR, PROJECT-NAME_VERSION_MINOR
PROJECT_VERSION_PATCH, PROJECT-NAME_VERSION_PATCH
PROJECT_VERSION_TWEAK, PROJECT-NAME_VERSION_TWEAK
CMAKE_PROJECT_VERSION(仅在顶层有效)

  • DESCRIPTION:项目描述,通常比较短的字符串,不超过几个单词,可选。内容会保存在以下变量中:

PROJECT_DESCRIPTION, PROJECT-NAME_DESCRIPTION
CMAKE_PROJECT_DESCRIPTION (仅在顶层有效)

  • HOMEPAGE_URL:指定项目的URL主页,可选。保存在以下变量中:

PROJECT_HOMEPAGE_URL, PROJECT-NAME_HOMEPAGE_URL
CMAKE_PROJECT_HOMEPAGE_URL (仅在顶层有效)

  • LANGUAGES:选择构建项目所需的编程语言,可选。支持的语言包括C,CXX(即C ++),CUDA,OBJC(即Objective-C),OBJCXX,Fortran和ASM。如果未指定,则默认使用C和CXX。

3.3 add_executable

指定可执行文件名称和使用的源文件。
通常生成的可执行文件必须是全局唯一的,可以只是文件的逻辑名(如:test),也可以带有后缀(如:test.exe)。建议直接使用逻辑名,由cmake根据平台来自动补全,这样会提高代码的跨平台性能。

用法(1):

add_executable(<name> [WIN32] [MACOSX_BUNDLE]
               [EXCLUDE_FROM_ALL]
               [source1] [source2 ...])
  • name:可执行文件名称
  • WIN32:目标平台属性,如果声明,则可执行文件是运行在32bits Windows平台的
  • MACOSX_BUNDLE:目标平台属性
  • EXCLUDE_FROM_ALL:目标平台属性
  • source1…:源文件名称(如果在其他目录下需指定路径)

用法(2):

add_executable(<name> IMPORTED [GLOBAL])

可行性文件引用了外部的可执行文件,不是很常用。(至少目前为止我没用过,且没见过哪个项目用过。)

用法(3):

add_executable(<name> ALIAS <target>)

创建一个别名目标,以便name可用于在后续命令中引用targetname不会作为生成目标出现在生成的构建系统中。target可能不是非全局导入的目标或ALIAS。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

翔底

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

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

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

打赏作者

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

抵扣说明:

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

余额充值