美文网首页开发环境搭建CMake
跨平台编译的经验之谈--cmake编译文件的一般方法

跨平台编译的经验之谈--cmake编译文件的一般方法

作者: NVision | 来源:发表于2017-06-23 13:49 被阅读246次

最近,一直在用CMake构建跨平台的工程,构建了基于OGRE的NVision工程Demo,该Demo可以运行在Unix, Android, iOS系统上,不包括Windows系统, MacOS系统后续构建中。


总体上来说,由于Android系统编译输出没有可执行文件(输出的为so库),其构建方式稍有特殊之外,  其它系统的构建流程基本一致, 下面先以Unix系统为例来说明问题。

1 基本构建流程

先考虑一个最简单的情况:

假设我们的工程里只有一个需要构建的main.c文件,在main.c的同一级目录下,我们创建一个CMakeLists.txt文件,其内容如下:

cmake_minimum_required(VERSION 2.8.2)

project(my_project)

add_executable(my_target main.cc)

install(TARGETS my_target DESTINATION bin)

该CMakeLists.txt的内容中,包含了构建Unix工程,到编译输出可执行文件的一整套流程。该流程也可以作为iOS, MacOS系统的大体基本框架。


简单说明:

上述CMakeLists.txt文件 称之为 CMake编译文件,它的功能即将一个main.cc编译成一个一个my_target可执行文件,并存放在编译目录下的bin目录下.

my_target -目标文件名,即我们最后要输出的文件,我们添加头文件,链接库,编译源码都是针对该目标文件, 目标文件可以是执行文件,也可以是库文件。

cmake_minimum_required -- 指定cmake的版本,往往会解决在一些平台上编译兼容性的问题。

project -- 为cmake指定一个编译工程, 你可以将其理解为cmake开始执行的入口。其所在的CMakeLists.txt为主CMake编译文件. 一般一个复杂的工程里,会有若干个目录,每个目录下都有一个CMakeLists.txt,而根目录下的CMakeLists.txt便为主CMake编译文件,其它的CMake编译文件需要由在主CMake编译文件中进行添加

add_executable -- 根据我们给定的源码,构建一个可执行的目标文件,他会根据不同的平台输出不同后缀格式的可执行文件。默认设置WIN32,那么它会在Windows系统上生成exe的可执行文件,如果不是MacOS系统,那么会生成一个.app的可执行文件。这个需要我们到编译文件目录下执行build命令

install -- 输出我们的可执行文件到指定目录,这个需要执行安装命令可以生成。


链接第三方库的情况:

当我们的工程开始变得复杂时,我们必然会面临引用库的问题。假设我们有个thirdparty目录:

my_project

|--CMakeLists.txt

|--main.c

|-- thirdparty

|-- |-- include

|--|--|-- *.h

|-- |-- src

|--|--|--*.so

1 包含库的头文件

include_directories(thirdparty/include/)

include_directories--会为当前CMake编译文件中的所有 目标文件添加一个包含路径,该路径是相对于CMake编译文件的路径的。

2 链接库

target_link_libraries(my_target third party/src/*.so)  //注意这里的*不是包含所有的意思,而是指某个具体的名字,如果thridparty目录下有多个so,需要分别写

target_link_libraries--会为我们编译的target 指定链接的库或者flags,它必须在我们已经创建了一个target(即调用了add_executable或add_library)后才能调用


总结:

本文浅显的总结了一个CMake编译文件的一般书写范式如下:

cmake_minimum_required(VERSION 2.8.2)

project(my_project)

include_directories(thirdparty/ include/*.h)

add_executable(my_target main.c)

target_link_libraries(my_target thirdparty/src/*.so)

install(TARGETS my_target DESTINATION bin)

但是还有诸多方面我们没有涉及到,如:

1 指定编译器选项 及 指定cmake选项

2 iOS 平台 和 Unix平台的差异 以及与Android平台差异

3 如何链接 库或输出目标文件到指定目录

4 如何构建多CMake编译文件系统。

5 .cmake 文件即其使用

这些我们会在后文详细补充和完善


相关文章

  • 跨平台编译的经验之谈--Xcode之旅

    在<<跨平台编译的经验之谈--cmake编译文件的一般方法>>一文中,总结了CMake编译文件CMakeLists...

  • 跨平台编译的经验之谈--cmake编译Android之ndk-b

    不同于<<跨平台编译的经验之谈--cmake编译文件的一般方法>>一文中总结的一般方法,Android由于运行文件...

  • 跨平台编译的经验之谈--cmake编译文件的一般方法

    最近,一直在用CMake构建跨平台的工程,构建了基于OGRE的NVision工程Demo,该Demo可以运行在Un...

  • CMake基础编译方式

    【1】CMake基础CMake是一种跨平台编译工具 CMake主要是编写CMakeLists.txt文件 通过cm...

  • cmake 工具链

    一、什么是Cmake CMake是一种跨平台编译工具。CMake主要是编写CMakeLists.txt文件 通过c...

  • centos7 cmake3安装

    以下介绍在 CentOS 操作系统中安装 Cmake 3.12.4 的方法,CMake 是跨平台的安装编译工具,我...

  • CMake

    概述 CMake 是一种跨平台编译工具。 CMake 主要是编写 CMakeLists.txt 文件 然后用 cm...

  • cmake脚本基础

    1.cmake作用 cmake是开源的跨平台的生成native的编译配置文件的工具,使用cmake可以生成适应当前...

  • Cmake 简单使用

    一. CMake编译原理   CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主...

  • cmake、makefile、cmakelist.txt

    一:cmake cmake是一个跨平台的编译工具,可以用简单的语言描述所有平台的编译过程。如果我们正常想要编译一个...

网友评论

    本文标题:跨平台编译的经验之谈--cmake编译文件的一般方法

    本文链接:https://www.haomeiwen.com/subject/crteqxtx.html