一只海星的主页

手把手教你使用CMake自动编译中CMakeLists.txt 怎么写

背景

CMake 一直都是用别人的开源项目来编译,Makefile都是自己写。
最近看zlm源码,里面用的CMake编译,比较简洁易懂!
所以有尝试给现有项目也写个CMakeList.txt来使用cmake自动编译,跟它耍耍!

基础语法介绍

主要参考以下链接地址:
《CMakeLists.txt 语法介绍与实例演练》

  • 项目名称:
#指定项目的名称 project name 
PROJECT(AppMedia)
  • 添加头文件
include_directories(
./
include
src
include/common
)

这里有一个疑问,暂时没有到批量包含目录和N级子目录的用法。自己写的Makefile就可以随意扫描包含目录及其子目录等。

  • 源头文件
#源文件目录 source directory 
aux_source_directory(src DIR_SRCS)
  • 环境变量
#设置环境变量 set environment variable 编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
set(PROJECT_SRC ${DIR_SRCS})
  • 生成目录程序/lib
#添加要编译的可执行文件 add executable file
add_executable({PROJECT_NAME}{PROJECT_SRC})

这样就是可以编译一些基础的test程序

其他常用语法介绍

实际工程里面,不像上面那么简单就是src、include生成hellword就行了
指定版本
屏蔽cmake的版本差异,如果项目简单不涉及版本差异功能可以不加

#指定cmake版本 cmake verson 
cmake_minimum_required(VERSION 3.2)
#指定C++使用C++ 11
set(CMAKE_CXX_STANDARD 11)
  • 特殊宏定义
    指定编译宏,也可以cmake命令直接加 cmake -DXXXXX …这样的调用
# 增加音频codec宏定义
add_definitions(-DHI_ACODEC_TYPE_INNER)
  • 增加Strip
    我没有找到可以调用strip命令的方法,所以在编译选项加-s
# 增加Strip
set(CMAKE_C_FLAGS "-s")
set(CMAKE_CXX_FLAGS "-s")
  • 增加编译选项指定
# Release编译选项
add_compile_options(-Wall -Wno-unknown-pragmas -Wno-format -fpic -O2 -fno-strict-aliasing -s -fno-strict-aliasing -Wno-unused-variable -Wno-unused-value)
  • 增加第三方依赖库
    这里几个技巧
  1. file命令扫描所有带.a后缀的库,同理可以用于.so。
  2. –start-group –end-group 可以忽略静态库调用前后的顺序依赖。
#添加依赖库 add link library
file(GLOB_RECURSE STATIC_LIBS {CMAKE_CURRENT_SOURCE_DIR}/lib/*.a)
target_link_libraries({PROJECT_NAME}
    -Wl,--start-group
    ${STATIC_LIBS}
    pthread
    dl
    -Wl,--end-group
    )
  • 交叉编译
# 交叉编译设置 corss build 
set(CROSS aarch64-himix100-linux-)
set(CMAKE_C_COMPILER {CROSS}gcc)
set(CMAKE_CXX_COMPILER{CROSS}g++)

参考

  1. CMakeLists.txt 语法介绍与实例演练
  2. CMakeLists.txt的写法
  3. CMakeLists多目录通用模板及Win&Linux兼容动态库编写
  4. cmake linux模板 多目录_Cmake 语法与实战入门
  5. 多级目录下cmake CMakeLists.txt使用方法(多个CmakeLists.txt编译)
  6. cmake 遍历目录获取所有文件名
  7. cmake增加编译宏
  8. CMakeFile命令之file

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注