网易首页 > 网易号 > 正文 申请入驻

抛弃 Autotools 向 CMake 迈进吧 | Linux 中国

0
分享至

  导读:CMake 是一个跨平台的编译、测试和打包软件,即使你以前从来没有使用过构建系统,也可以轻松上手。

  本文字数:8111,阅读时长大约: 11分钟

  https://linux.cn/article-13419-1.html
作者:Seth Kenlon
译者:amwps290

  在我以前的文章 一文中,我说明了如何使用 Autotools 来管理和打包代码。这是一个强大且通用的平台,可轻松集成到许多打包系统中,包括 RPM、APT、 等等。它的语法和结构可能会令人困惑,但幸运的是,我们还有其他选择,开源的 就是其中一个。

  CMake 是一个用于构建、测试和打包软件的跨平台套件。它使用简单而清晰的语法,因此即使你以前从未使用过构建系统,也很容易开始使用。

  安装 CMake

  CMake 可能已经安装在你的 Linux 系统上。如果没有,你可以使用发行版的程序包管理器进行安装:

  1.   $ sudo dnf install cmake

  在 Debian 或者其他相似的系统上:

  1.   $ sudo apt install cmake

  在 Mac 上,你可以使用 或者 来安装:

  1.   $ sudo port install cmake

  在 Windows 上,你可以使用 或者直接从 下载二进制来安装。

  使用 CMake

  对于想要从源代码构建软件的开发人员或用户来说,CMake 是一种快速简便的编译和安装方法。CMake 分阶段工作:

  1. 首先,在 步骤中,CMake 扫描计算机查看一些默认设置。默认设置包括库的位置以及在系统上安装软件的位置。

  2. 接下来,使用系统上的 命令(在 Linux 上是 GUN Make,在 上是 NetBSD Make)来编译程序。这个过程通常是将人类可读的源代码转换成机器语言。

  3. 最后,在 一步中,那些编译过的文件将被拷贝到(在 步骤中扫描出来的)计算机上合适的位置。

  这看起来很简单,当你使用 CMake 时就是这样。

  CMake 的可移植性

  CMake 在设计时就考虑了可移植性。虽然它不能使你的项目在所有 POSIX 平台上都能正常工作(这取决于作为开发者的你),但它可以确保将标记为要安装的文件安装到已知平台上最合适的位置。而且由于有了 CMake 之类的工具,对于高级用户而言,根据其系统需求自定义和覆盖任何不合适的选项都很容易。

  使用 CMake,你只需要知道将哪些文件安装到哪个常规位置即可。它会照顾其他一切。不再需要自定义安装脚本,它们有可能在任何未经测试的操作系统上失败。

  打包

  像 Autotools 一样,CMake 也得到了很好的打包支持。无论它们是打包成 RPM 还是 DEB 或 TGZ(或其他任何东西),将带有 CMake 的项目交给打包者,他们的工作既简单又直接。打包工具支持 CMake,因此可能不需要进行任何修补或者调整。在许多情况下,可以自动将 CMake 项目整合到工作流程中。

  如何使用 CMake

  要在项目中使用 CMake,只需在项目目录中创建 CMakeLists.txt 文件。首先,声明最低要求的 CMake 版本以及项目名称和版本。CMake 会努力在尽可能长时间内保持兼容性,但是随着你使用的时间越长,并且关注它最新的开发动态,你就会知道哪些特性是你所依赖的。

  1.   cmake_minimum_required(VERSION 3.10)

  2.   project(Hello VERSION 1.0)

  如你可能已经看到的那样,CMake 的语法是一个带有括号和参数的命令。大写的 VERSION 字符串不是任意的,也不只是格式。它们是 project 命令中的有效参数。

  在继续之前,先写一个简单的 C 或者 C++ 的 hello world 程序。为了简单,我就写了六行 C 代码,并把它保存在 hello.c 中(为了匹配我在 CMakeLists.txt 中可执行文件的名字)。

  1.   #include

  2.   int main() {

  3.   printf("Hello open source\n");

  4.   return 0;

  5.   }

  不过,不要搞错了,CMake 不仅适用于 C 和 C++。它可以处理任意文件,并且有许多可用的命令,因此它可以帮助你维护许多不同形式的项目。

  CMake 网站中记录了所有有效的内置命令及其可用参数,因此无论你要做什么,都可以轻松发现所需的功能。不过,这是一个简单的示例,因此,你需要的下一个命令是必不可少的 —— 你必须为 CMake 定义要构建的代码:

  1.   add_executable(Hello hello.c)

  这个命令指定了你编译后的二进制文件的名字为 Hello。因此,它与你在终端中执行带有 -o Hello 的 命令是一样的。

  在一些比较复杂的项目中,你可能还需要使用库文件,你可以使用 add library 命令来链接库文件。

  在你设置了你想要构建和标记为安装的文件之后,你必须要告诉 CMake 一旦用户安装了程序,最终的应用程序应该在哪个位置。

  在这个简单的例子里,你仅需要做的一件事就是在你的 CMakeLists.txt 文件里添加 install 命令。install 命令接收几个参数。但是在这个例子中,你仅需要使用 TARGET 命令来指定你要安装文件的名字。

  1.   install(TARGETS Hello)

  向 CMake 工程添加一些文件

  一个软件项目向用户交付的往往不仅仅只有代码,还有一些其他的文件数据,例如手册或者是信息页、示例项目,或者是配置文件。你可以使用与包含编译文件时类似的工作流程,将任意数据包含在 CMake 项目中:在 CMakelists.txt 文件中使用 file 命令,然后说明一下这些文件要安装在哪里。

  例如,你可以在这个项目中包含一个 assets 目录,你可以使用 file 命令,后面跟上 COPYDESTINATION 参数来告诉 CMake 将这些额外的文件复制到你的分发包中。

  1.   file(COPY assets DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")

  这个 ${CMAKE_CURRENT_BINARY_DIR} 变量是一个特殊的 CMake 内置变量,表示 CMake 正在处理的目录。换句话说,你的任何文件都会被复制到编译目录(在你运行 命令后,这个过程会更加清晰,到时候回过头来看一下)。

  因为这些额外的数据文件有些杂乱不堪(如果你不信的话,可以看一下 /usr/share 这个目录)。对于你自己的项目创建一个子文件夹对谁都有好处。最好也带上版本名字。你可以通过在 CMAKE_CURRENT_BINARY_DIR 中指定一个新的目录,使用你选择的项目名称,后面跟一个为你的项目命名的特殊变量和你在项目声明中为它设置的 VERSION

  1.   file(COPY assets DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/Hello-${Hello_VERSION}")

  定义安装位置

  你已经定义你要编译的文件,因此现在你要告诉 CMake 你的程序要安装在哪个位置。比如你的主程序,这个要程使用 install 命令:

  1.   install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Hello-${Hello_VERSION}" TYPE DATA)

  这里有一些新的参数。DIRECTORY 参数指定了数据文件是一个目录,而不是一个文件(FILE)或者脚本(SCRIPT)。你使用的参数和复制一些额外文件到编译目录时是一样。另外,在 install 命令中 TYPE 或者 DESTINATION 必须要指定其一。TYPE 参数指定了通用的文件类型,这些文件通常将会被放到合适的位置。在 Linux 系统上,TYPE DATA 一般是 /usr/local/share 或者 /usr/share,除非用户定义了其他的位置。

  这是诸如 CMake 之类的良好构建系统的强大功能之一。你不必担心文件的确切位置,因为你知道用户可以更改 CMake 的首选默认设置,并且 CMake 将构建代码以使其正常工作。

  运行 CMake

  CMake 有多种方式来让你执行命令,你可以在终端或者在一个可交互的程序上执行命令,或者你也可以使用它的图形界面(GUI)。我比较偏向于使用终端命令,但是我也喜欢使用一些其他的方式(相比与在 Makefile 中查找那些晦涩的变量然后去修改它们更胜一筹)。

  对于编译过开源 C++ 项目的任何人,都熟悉的第一步是创建一个 build 目录,进入到该目录,然后运行 命令。我是一个懒惰的打字员,所以我将构建目录命名为 b,但是你可以使用最合适的方式:

  1.   $ mkdir b

  2.   $ cd b

  3.   $ cmake ..

  4.   -- The C compiler identification is GNU 11.1.1

  5.   -- The CXX compiler identification is GNU 11.1.1

  6.   -- Detecting C compiler ABI info

  7.   -- Detecting C compiler ABI info - done

  8.   -- Check for working C compiler: /usr/bin/cc - skipped

  9.   -- Detecting C compile features

  10.   -- Detecting C compile features - done

  11.   -- Detecting CXX compiler ABI info

  12.   -- Detecting CXX compiler ABI info - done

  13.   -- Check for working CXX compiler: /usr/bin/c++ - skipped

  14.   -- Detecting CXX compile features

  15.   -- Detecting CXX compile features - done

  16.   -- Configuring done

  17.   -- Generating done

  18.   -- Build files have been written to: /var/home/seth/demo-hello/b

  19.   $

  这或多或少相当于经典的 ./configure; make; make install 中的 ./configure。看一下你的构建目录,CMake 已经帮你生成了几个新的文件,来让你的项目更完整。这里生成了 CMake 的数据文件、一个常规的 Makefile 文件(这是一个免费提供的 247 行的文件,但对于越复杂的项目,行数要多得多),还有一个包含这个示例程序的任意非编译数据的 Hello-1.0 目录。

  1.   $ ls

  2.   CMakeCache.txt

  3.   CMakeFiles

  4.   Makefile

  5.   Hello-1.0

  6.   cmake_install.cmake

  接下来,你可以进行构建。你可以使用 CMake 的 --build 选项来做这件事,使用当前的构建目录作为源目录。

  1.   $ cmake --build .

  2.   Scanning dependencies of target Hello

  3.   [ 50%] Building C object CMakeFiles/Hello.dir/hello.c.o

  4.   [100%] Linking C executable Hello

  5.   [100%] Built target Hello

  或者你可以运行 命令。这将读取由 CMake 生成的 Makefile 文件。在这个例子中, 默认的行为就是由源程序 hello.c 生成目标文件。

  1.   $ make

  2.   Scanning dependencies of target Hello

  3.   [ 50%] Building C object CMakeFiles/Hello.dir/hello.c.o

  4.   [100%] Linking C executable Hello

  5.   [100%] Built target Hello

  6.   $

  如你所料,Hello 二进制可执行文件现在存在于当前的构建目录中。因为它是一个简单的自包含应用程序,所以你可以运行它进行测试:

  1.   $ ./Hello

  2.   Hello open source

  3.   $

  最后,你可以用 --install 选项进行安装。因为我不希望我的简单的 “hello world” 应用程序真的被安装到我的系统上,我设置了 --prefix 选项,将 CMake 的目标从根目录(/)重定向到 /tmp 的一个子目录。

  1.   $ cmake --install . --prefix /tmp/hello/

  2.   -- Install configuration: ""

  3.   -- Installing: /tmp/dist-hello/usr/local/bin/Hello

  4.   -- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0

  5.   -- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file0

  6.   -- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file1

  另外,你也可以运行 来调用 Makefile 的安装动作。同样,为了避免在我的系统上安装一个演示程序,我在这个例子中设置了 DESTDIR 变量,将安装目标重定向到 /tmp 的一个子目录:

  1.   $ mkdir /tmp/dist-hello

  2.   $ make install DESTDIR=/tmp/dist-hello

  3.   [100%] Built target Hello

  4.   Install the project...

  5.   -- Install configuration: ""

  6.   -- Installing: /tmp/dist-hello/usr/local/bin/Hello

  7.   -- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0

  8.   -- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file0

  9.   -- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file1

  看一下输出的内容,来确定它具体的安装位置,这个程序已经安装好了。

  快速自定义

  CMake 的安装前缀(由 CMAKE_INSTALL_PREFIX 变量指定)默认是在 /usr/local 这个位置,但是所有的 CMake 变量都可以在你运行 命令的时候,加一个 -D 选项来改变它。

  1.   $ cmake -DCMAKE_INSTALL_PREFIX=/usr ..

  2.   $ make install DESTDIR=/tmp/dist-hello

  3.   $ make install DESTDIR=/tmp/dist-hello

  4.   [100%] Built target Hello

  5.   Install the project...

  6.   -- Install configuration: ""

  7.   -- Installing: /tmp/dist-hello/usr/bin/Hello

  8.   -- Installing: /tmp/dist-hello/usr/share/Hello-1.0

  9.   -- Installing: /tmp/dist-hello/usr/share/Hello-1.0/assets/file0

  10.   -- Installing: /tmp/dist-hello/usr/share/Hello-1.0/assets/file1

  所有由 CMake 使用的变量都可以通过这种方式来修改。

  交互式的 CMake

  CMake 的交互模式是一种用于配置安装环境的友好而有用的方法。要让用户知道该项目使用的所有可能的 CMake 变量是一件工作量很大的事,因此 CMake 交互式界面是他们无需查看 MakefileCMakeLists 即可发现自定义选项的简便方法。

  为了调用这个交互式的 CMake,使用 ccmake 命令,在这个简单的项目里没有太多的东西。但是对于像 这样的大型项目,这将非常有用。

  Rosegarden

  CMake 的更多知识

  还有很多很多的 CMake 知识需要去了解。作为一个开发者,我非常喜欢它简洁的语法、详尽的文档、可扩展性以及便捷性。作为一个用户我非常喜欢 CMake 友好且实用的错误提示信息还有它的用户界面,如果你的项目还未开始使用构建系统,请了解一下 CMake 吧。你以及以后尝试打包你应用程序的任何人都不会后悔。

  via:

  作者: 选题: 译者: 校对:

  本文由 原创编译, 荣誉推出

  欢迎遵照 CC-BY-NC-SA 协议规定转载,

  如需转载,请在文章下留言 “ 转载:公众号名称”,

  我们将为您添加白名单,授权“ 转载文章时可以修改”。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
榴莲、蓝莓、樱桃……水果为何纷纷大降价

榴莲、蓝莓、樱桃……水果为何纷纷大降价

齐鲁壹点
2024-06-20 07:17:11
欧盟汽车关税大逆转24小时:多国齐齐反对,法国总统力挺遭围攻!

欧盟汽车关税大逆转24小时:多国齐齐反对,法国总统力挺遭围攻!

匹夫来搞笑
2024-06-20 16:10:09
上海Manner一男店员因被催单殴打女顾客,成年人的崩溃只在一瞬间

上海Manner一男店员因被催单殴打女顾客,成年人的崩溃只在一瞬间

吃瓜体
2024-06-20 21:00:57
Windows爆出核弹级漏洞!Win7-Win11无一幸免:微软紧急发布更新

Windows爆出核弹级漏洞!Win7-Win11无一幸免:微软紧急发布更新

快科技
2024-06-21 11:52:08
除了性生活就是打麻将,揭露中国2000多个县城,普通人的生活实录

除了性生活就是打麻将,揭露中国2000多个县城,普通人的生活实录

贾文彬的史书
2024-06-20 15:20:26
收网了!冲突后我海警再进仁爱礁巡航,坐滩舰出现明显倾斜

收网了!冲突后我海警再进仁爱礁巡航,坐滩舰出现明显倾斜

笔墨V
2024-06-21 12:35:43
团结的潘帕斯!阿根廷全队没有庆祝,赶去查看拼抢倒地的麦卡

团结的潘帕斯!阿根廷全队没有庆祝,赶去查看拼抢倒地的麦卡

直播吧
2024-06-21 09:33:22
外国游客扎堆打卡中国,西方舆论战瞬间破产

外国游客扎堆打卡中国,西方舆论战瞬间破产

枫冷慕诗
2024-06-20 19:39:40
法媒:重回中国,外国旅客要适应让他们猝不及防的全数字化生活

法媒:重回中国,外国旅客要适应让他们猝不及防的全数字化生活

新时光点滴
2024-06-21 04:54:19
为啥中国男性很少戴机械表了?网友分享让我醍醐灌顶,太务实了吧

为啥中国男性很少戴机械表了?网友分享让我醍醐灌顶,太务实了吧

有趣的火烈鸟
2024-06-20 19:17:01
英格兰版“九子夺嫡”:凯恩失势 福登与贝林厄姆争宠

英格兰版“九子夺嫡”:凯恩失势 福登与贝林厄姆争宠

球事百科吖
2024-06-21 10:53:30
男人“羞羞”为什么冲刺几下特别重?完事还要顶两下

男人“羞羞”为什么冲刺几下特别重?完事还要顶两下

水白头
2024-06-17 00:15:02
玫瑰的故事:直到肖小雨往方协文身上生扑,才明白他为何同意离婚

玫瑰的故事:直到肖小雨往方协文身上生扑,才明白他为何同意离婚

娱乐故事
2024-06-21 11:08:10
俄罗斯开始撒泼耍赖!

俄罗斯开始撒泼耍赖!

凡事一定有办法13119
2024-06-20 11:05:32
普京访问朝鲜和越南,两边接待规格的五大区别,说明什么呢

普京访问朝鲜和越南,两边接待规格的五大区别,说明什么呢

低调看天下
2024-06-20 20:04:50
太激烈,申请承办国足世预赛18强的七座城市出炉

太激烈,申请承办国足世预赛18强的七座城市出炉

百里无心
2024-06-21 07:23:53
考公的斯坦福博士父母等情况披露!岗位限5年不能流出本乡镇

考公的斯坦福博士父母等情况披露!岗位限5年不能流出本乡镇

南方都市报
2024-06-18 19:18:05
铁头一泡尿后?赴日签证新增6项要求,多家大旅行社被停止赴日签证递交业务

铁头一泡尿后?赴日签证新增6项要求,多家大旅行社被停止赴日签证递交业务

日本物语
2024-06-20 16:31:17
雷军骑单车上班引热议:英国品牌Brmopton!网友:本来还想整个雷总同款呢,一看“小布”卖1.5万

雷军骑单车上班引热议:英国品牌Brmopton!网友:本来还想整个雷总同款呢,一看“小布”卖1.5万

和讯网
2024-06-20 14:49:00
网友笑翻了!上汽把欧盟加征38.1%关税字样做进了周边产品

网友笑翻了!上汽把欧盟加征38.1%关税字样做进了周边产品

热点科技
2024-06-19 18:42:43
2024-06-21 15:28:49
Linux
Linux
Linux 中国开源社区
8016文章数 73124关注度
往期回顾 全部

科技要闻

已经全球第一了,为什么还要“奋斗100天”

头条要闻

牛弹琴:菲律宾与中国在海上摩擦后 被西方媒体打脸了

头条要闻

牛弹琴:菲律宾与中国在海上摩擦后 被西方媒体打脸了

体育要闻

1-0"吊打"意大利 西班牙这就叫冠军相?

娱乐要闻

陈晓惹争议!被曝婚变离家出走冷暴力

财经要闻

普华永道,引火烧身

汽车要闻

领克纯电 来得不晚

态度原创

健康
教育
旅游
艺术
时尚

晚餐不吃or吃七分饱,哪种更减肥?

教育要闻

中考数学,常考思维题,难哭不少学生

旅游要闻

强降雨天气来袭:桂林部分景点关闭 酒店启动退改

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

上年纪的女性,建议穿“裙子”选择过膝长度,优雅还提升气质

无障碍浏览 进入关怀版