美文网首页开发环境搭建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 文件即其使用

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


    相关文章

      网友评论

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

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