最近,一直在用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 文件即其使用
这些我们会在后文详细补充和完善
网友评论