废话少说,直接干货。上面这张图可知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 ...)
添加方式有两种:
比如,你在代码中可能有如下写法:
#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