相关文章推荐

废话少说,直接干货。上面这张图可知cmake是可跨平台的编译工具,当公司一套代码运行到多平台的时候,比如:android,ios,windows,linux可以同时用cmake做编译。当然不同平台需要配置不同的编译环境,比如:android需要配置ndk,ios需要配置xcode,这个配置后续会持续输出,欢迎关注,今天先说基本的命令。

本文内容从简入繁,最后是一个小项目完整示例本系列教程从本篇基本功开始,欢迎持续关注

cmake语法与shell语法类似,但是大小写都支持

命令名称([可选])

project

项目的基础设置

project( [LANGUAGES] [...])project(        [VERSION [.[.[.]]]]        [LANGUAGES ...])
  • PROJECT-NAME必选项,给项目起的名字
  • LANGUAGES可选项CCXX
project(test C) 
# 项目信息project( demo1         VERSION 1.2.3         DESCRIPTION "项目描述,比如:本项目非常牛逼"         HOMEPAGE_URL "项目地址,比如:https://github.com/XXX/YYY"         LANGUAGES CXX        )

set 命令是对一个 变量的赋值 ,这个变量可以是cmake自带的,也可以是自定义的

set 系统自带的变量

set( CMAKE_CXX_FLAGS "-std=c++11" )//以flags的形式的实现通知使用版本set(CMAKE_CXX_STANDARD 11)//以命令形式通知使用版本

set自定义的变量

set(THIRD_PART "${CMAKE_CURRENT_SOURCE_DIR}/src/third/include")//设置头文件的搜索路径include_directories(${THIRD_PART})

add_definitions

添加一个flag用于预处理,其实就是添加一个宏定义

add_definitions(-DFOO -DBAR ...)

添加方式有两种:

  • -D开头
  • /D开头

比如,你在代码中可能有如下写法:

#ifdef TEST//TODO if#else//TODO else#endif

那么如何不修改代码而是通过编译脚本控制这个宏呢,这就使用到了本命令:add_definitions,如下所示

add_definitions("-DTEST")

此时这个TEST宏会在 预处理阶段 与源码结合。

include_directories

指定包含的头文件的搜索路径

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
  • dir指定路径:我们通过参数可以发现: 路径至少一个,可以有多个,多个路径以空格分隔
  • AFTER|BEFORE 指定搜索顺序:默认是当前路径的后面,即after。这里可以修改为before,即:在当前头文件搜索之前进行搜索。
  • SYSTEM:正如名字含义,这个是指定具体某一个系统平台的头文件,比如:windows特有的mfc

注意:路径中有空格,则需要用双引号将其括起来

aux_source_directory

将某目录下的所有的源码文件设定一个变量名称,便于后期 使用变量名代替所有的源码文件 ,比如与add_library生成静态库一并使用,以便 指定子构建系统的构建的库类型和名称

aux_source_directory(
  • dir 必选项,是源码路径
  • variable 是给这组源码设定的变量名

结合使用命令

  • add_library:指定子构建系统编译类型,子构建通常会编译成库文件,比如.a
aux_source_directory(. DIR_LIB_SRC)add_library(mylib STATIC ${DIR_LIB_SRC})

解析:将本目录下的所有的源码文件设置为变量DIR_LIB_SRC,然后构建一个动态库。

add_library

将源码编译成指定的库(类型+名称)

add_library( [STATIC | SHARED | MODULE]            [EXCLUDE_FROM_ALL]            [source1] [source2 ...])
  • name是库名称,必须指定
  • STATIC | SHARED | MODULE 是库类型,注意这里是大写
  • source 是源码文件

生成library的目的和作用

  • 对外提供库文件
  • 提供库文件供顶层目录使用

结合使用命令

  • aux_source_directory
  • target_link_libraries

示例1.1:对外提供库文件之android将源码编译成动态库

add_library(        # Specifies the name of the library.        libDemo        # Sets the library as a shared library.        SHARED        # Provides a relative path to your source file(s).        src/main/jni/test1.cpp        src/main/jni/test2.cpp        src/main/jni/test3.cpp)

示例1.2:对外提供库文件之android将源码编译成动态库与aux_source_directory结合使用

aux_source_directory(./src/main/jni custom)add_library(        # Specifies the name of the library.        libDemo        # Sets the library as a shared library.        SHARED        # Provides a relative path to your source file(s).        ${custom})

示例1.3:对外提供库文件之非android示例

与android示例本质上一样都属于子构建系统,区别是:android没有顶层构建直接与jni通信,非android有顶层构建通过add_subdirectory添加本子构建系统

aux_source_directory(. SUBLIB1_SRC)add_library(subLib1 ${SUBLIB1_SRC})

示例2:与target_link_libraries结合执行顶级构建

add_library与target_link_libraries结合构建顶级编译系统,通常是为了对外提供的是库文件,比如android的构建

aux_source_directory(./ TOP_SRCS)add_library(libraryLink SHARED ${TOP_SRCS})target_link_libraries(    libraryLink)

add_subdirectory

多编译系统,即多个CMakeList.txt,非顶级的构建都属于子构建系统。子构建系统是通过add_library生成构建库文件的,但是顶级构建怎么关联子构建系统呢,就用到了本命令。

Add a subdirectory to the build.

add_subdirectory(source_dir [binary_dir]                 [EXCLUDE_FROM_ALL])
  • source_dir:子编译系统目录
  • binary_dir:如果source_dir不是当前(CMakeList.txt)目录,那么需要显示指定binary_dir的值,binary_dir是用于指定source_dir经过编译后的输出文件的目录
  • EXCLUDE_FROM_ALL 将指定目录排除编译
add_subdirectory(./subLib1)

注意:本命令的唯一的一个必选项是子编译系统目录,子编译系统目录,而非子编译系统生成的库名称

target_link_libraries

链接所有的library,子编译系统,库文件

  • library:add_library
  • 子编译系统:add_subdirectory
  • 库文件:静态库文件.a和动态库文件.so
cmake_minmum_required(VERSION 3.4.1)project(linkDemo CXX)//1. 添加子编译系统add_subdirectory(./sublib)//2. 顶级编译系统aux_source_directory(./ TOP_SRCS)add_executable(linkDemo ${TOP_SRCS})//3. 第三方库set(THIRD_PART "${CMAKE_CURRENT_SOURCE_DIR}/src/third/include")include_directories(${THIRD_PART})message("third part include path = ${THIRD_PART}")message("thrid part libs path = ${THIRD_PART}/libs/XXX.a")//4. 链接:子系统+顶级系统+第三方库target_link_libraries(    linkDemo    sublib    "${THIRD_PART}/libs/XXX.a")

本文为同名VX公众号原创,欢迎关注

本教程为系列教程,持续更新,未完待续,欢迎转发,转发请请注明出处

本教程为系列纯干货教程,内容原创,持续更新,欢迎关注转发废话少说,直接干货。上面这张图可知cmake是可跨平台的编译工具,当公司一套代码运行到多平台的时候,比如:android,ios,windows,linux可以同时用cmake做编译。当然不同平台需要配置不同的编译环境,比如:android需要配置ndk,ios需要配置xcode,这个配置后续会持续输出,欢迎关注,今天先说基本的命令。本文内容...
一、 dll 生成 1、设置项目属性:打开 vs ,建立空项目,在项目的 配置属性->常规->项目默认值->配置类型 修改为:动态库(. dll ) 2、准备 文件 :填写 头文件 和源 文件 ,注意 头文件 的声明,源 文件 正常。 ————————————————————————————————————— | 头文件 : ...
我们平常使用 CMake 时,主要是在x86或x86_64平台上,其实 CMake 在2.6版本后就已经支持交叉 编译 了,下面就来看下如何使用 CMake 进行Arm Linux程序的交叉 编译 。 一 建立工程 按照如下结构体建立一个简单工程 main.c内容如下, #include <stdio.h> int main(void) printf("hello world\n");
CMake 编译 并使用SDE Library 目录 CMake 编译 并使用SDE Library环境项目修改 编译 . dll 文件 并确保它能正常使用测试使用. dll 文件 文件 下载链接 本篇博客所要做的是:Win10环境使用 CMake 编译 一个开源C++库,这个库所有.h 头文件 和.cpp源 文件 都有了,将这个库 编译 为动态链接库. dll 文件 。然后在不用重新 编译 库的情况下,使用 CMake 包含这个. dll 库并测试.exe可执行 文件 。 下载安装以下工具: MinGW x86位,用于C++ 编译 cmake cmake -3.20
咱们常用命令【 cmake ..】在build 目录 下配置生成项目和解决方案。 其实,这个命令还有其他用法。 指定 CMake Lists.txt中的变量值。比如 , fmt 库 的 CMake Lists.txt中有一个变量 【BUILD_SHARED_LIBS】,可以在命令行 指定 其值: 复制 cmake -DBUILD_SHARED_LIBS=TRUE .. 对比可知,多了中间 指定 变量的命令, 其他没有变化。 2. 指定 编译 器版本
1. cmake cmake 是kitware 公司以及⼀些开源开发者在开发⼏个⼯具套件(VTK)的过程中衍⽣品,最终形成体系,成为⼀个独⽴的开放源代码项⽬。官⽅⽹站是www. cmake .org,可以通过访问官⽅⽹站获得更多关于 cmake 的信息。 说就是:只有少数⼏个“ 编译 专家”能够掌握 KDE 现在的构建体系(admin/Makefile.common),在经历了unsermake, scons 以及 cmake 的选型和尝试之后,KDE4 决定使⽤ cmake 作为⾃⼰的构建系统。在迁移过程中,进展异常
在windows上,用 cmake 交叉 编译 arm程序。生成器用nijia. CMake Lists.txt cmake _minimum_required(VERSION 3.6) project(testApp) file(WRITE main.cpp "int main(void) { return 0; }") set(testApp "testApp") list( APPEN...
#THIS FILE IS AUTO GENERATED FROM THE TEMPLATE! DO NOT CHANGE! set( CMAKE _SYSTEM_NAME Generic) set( CMAKE _SYSTEM_VERSION 1) cmake _minimum_required(VERSION 3.17) # specify cross compilers and tools set( CMAKE _C_COMPILER arm-none-eabi-gcc) set( CMAKE _CXX_COMPI.
CMAKE _CXX_ARCHIVE_FINISH 是一个 CMake 变量,它可以用来在创建静态库时 指定 一个命令,该命令会在静态库创建完成之后被执行。这个变量可以用来执行一些额外的操作,比如将静态库的 输出 转换成一个更适合的格式,或者为静态库添加一些元信息等。 例如,你可以在 CMake Lists.txt 中这样使用这个变量: set( CMAKE _CXX_ARCHIVE_FINISH "< CMAKE _AR> rcs <TARGET> <LINK_FLAGS> <OBJECTS>") 上面的命令会将创建的静态库转换成一个可重定向的静态库 (rs)。 signature=a4d1083d28aa64b1dbf3be502f86441a,fexo/yarn.lock at master · forsigner/fexo · GitHub
 
推荐文章