Cmake杂记

本文介绍了CMake作为跨平台编译工具的作用,详细解析了CMake的使用步骤,包括编写CMakeLists.txt文件,指定最小版本,管理项目源文件,添加子目录,设定目标和链接库。同时,文章提供了多个CMake示例,如ffmpeg的配置,并讨论了CMake中的一些关键变量和编译器选项,帮助读者更好地理解和应用CMake。
摘要由CSDN通过智能技术生成

解决什么问题:
很多make工具有不同饭标准和规范,不支持跨平台,如果想跨平台就的为每个平台都写一份makefile,cmake就是用来可以跨平台的编译工具

使用步骤:
1.编写Cmakelist.txt
2.执行make PATH生成Makefile
3.使用make命令进行编译

安装:
编译源码
下载二进制文件
命令行操作需要:

CMAKE常用语法:
//指定最小支持的Cmake版本
cmake_minimum_required(VERSION 3.4.1)

./Demo3
|
±-- main.cc
|
±-- math/
|
±-- MathFunctions.cc
|
+— MathFunctions.h

CMake 最低版本号要求

cmake_minimum_required (VERSION 2.8)

项目信息

project (Demo3)

查找当前目录下的所有源文件

并将名称保存到 DIR_SRCS 变量

aux_source_directory(. DIR_SRCS)

添加 math 子目录

add_subdirectory(math)

指定生成目标

add_executable(Demo main.cc)

添加链接库

target_link_libraries(Demo MathFunctions)

查找当前目录下的所有源文件

并将名称保存到 DIR_LIB_SRCS 变量

aux_source_directory(. DIR_LIB_SRCS)

生成链接库

add_library (MathFunctions ${DIR_LIB_SRCS})

//指定头文件路径
include_directories(src/main/cpp/include/)
//调用系统日志库,并将其路径存储为log-lib变量
find_library(log-lib log )
//链接静态库
add_library( app-glue
         STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )

链接动态库
add_library(swscale4 SHARED IMPORTED)
set_target_properties( swscale4
PROPERTIES IMPORTED_LOCATION
C M A K E S O U R C E D I R / s r c / m a i n / j n i L i b s / {CMAKE_SOURCE_DIR}/src/main/jniLibs/ CMAKESOURCEDIR/src/main/jniLibs/{ANDROID_ABI}/libswscale4.so)

//链接库,最后进行关联
target_link_libraries( native-lib imported-lib app-glue ${log-lib} )

变量:
CMAKE_SOURCE_DIR:工程的顶层目录
CMAKE_CURRENT_SOURCE_DIR:当前Cmakelist文件所在的目录
//保存变量
set(BREAKPAD_ROOT ${CMAKE_CURRENT_SOURCE_DIR})

//GLOB 搜集文件,保存到变量中
file(GLOB BREAKPAD_SOURCES_COMMON
a.txt b.txt)
add_library(native-lib STATIC ${BREAKPAD_SOURCES_COMMON})

//设置编译器选项
set(CMAKE_C_FLAGS “KaTeX parse error: Double subscript at position 9: {CMAKE_C_̲FLAGS} -Wall -O…{CMAKE_CXX_FLAGS} -Wall -O3 -march=native -Wno-reorder”)

//build.gradle的配置
android {

defaultConfig {

    externalNativeBuild {
        cmake {
            cppFlags "-frtti -fexceptions"
            abiFilters 'armeabi'//, "x86"
        }
    }
}

externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}

sourceSets {
    main {
        jniLibs.srcDirs = ['src/main/jniLibs']
    }
}

}

例如ffmpeg的cmake编写:

cmake_minimum_required(VERSION 3.4.1)

include_directories(src/main/cpp/include)

#使用C文件生成so
add_library(player SHARED

src/main/cpp/player.cpp
 src/main/cpp/CallJava.cpp
 src/main/cpp/AudioPlayer.cpp
 src/main/cpp/AvPacketQueue.cpp
 src/main/cpp/FfmpegPlayer.cpp
 src/main/cpp/PlayStatus.cpp
 )

#调用系统日志库
find_library(log-lib log )

add_library(avcodec57 SHARED IMPORTED)
set_target_properties( avcodec57
PROPERTIES IMPORTED_LOCATION
C M A K E S O U R C E D I R / s r c / m a i n / j n i L i b s / {CMAKE_SOURCE_DIR}/src/main/jniLibs/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值