CMake编译规则梳理

CMake编译规则梳理 阿帅 2023-11-24 15:51:37 662

文章目录

概述

本文讲述Cmake常用语法和示例。

编译方式

源代码本地编译

顶层目录有CMakeLists.txt时,说明该代码是通过cmake进行编译的。
编译步骤:
1.mkdir build
2.cd build; cmake ..
3.make

源代码交叉编译

在CMakeLists.txt中增加如下配置,例如:

set(CMAKE_CXX_STANDARD 11)
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(TOOLCHAIN_DIR "/opt/linux/x86-arm/aarch64-mix210-linux")
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-mix210-linux-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-mix210-linux-g++)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -o3 -std=c++0x -fpermissive")

将其中系统架构,和交叉编译工具链路径改为自己的路径即可。

buildroot编译cmake代码包

在package.mk中使用$(eval $(cmake-package))进行编译

CMAKE常用关键字

指定cmake最低版本

例:cmake_minimum_required(VERSION 2.8)
编译时将检查cmake版本,示例必须大于2.8

指定项目名称

例:project(mylib)

设置变量

将一个CMAKE变量设置为给定值。

  set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])

将变量的值设置为。在被设置之前,会被展开。
如果有CACHE选项,那么就会添加到cache中;这时是必需的。

:对该变量作用的描述。

: 该变量的类型,可以是下述值中的一个:
FILEPATH = 文件选择对话框。
PATH = 路径选择对话框。
STRING = 任意的字符串。
BOOL = 布尔值选择复选框。
INTERNAL = 不需要GUI输入端。(适用于永久保存的变量)。

例:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_C_STANDARD 99)

set(RECEIVER_SOURCES receiver/receiver.c receiver/receiver.h)

CMAKE_CURRENT_BINARY_DIR

外部编译时,指的是target目录,内部编译时,指的是顶级目录

指定编译选项

set(CMAKE_C_FLAGS “${CMAKE_C_FLAGS} -z noexecstack -fstack-protector”)

指定库、头文件路径

指定头文件路径

INCLUDE_DIRECTORIES(PATH)
示例:添加当前路径
INCLUDE_DIRECTORIES(.)

链接指定库

指定库路径:LINK_DIRECTORIES()
链接库:target_link_libraries(bin_name lib_name)

指定SSL库

当系统中有多个ssl库时,需要指定特定路径下的ssl库时:

set(OPENSSL_ROOT_DIR "/usr/local/kssl/1.1")
find_package(OpenSSL 1.1.1 REQUIRED)
if (OpenSSL_FOUND)
    message(STATUS "found library:${OPENSSL_LIBRARIES},${OPENSSL_INCLUDE_DIR} ENABLE_OPENSSL defined")
    include_directories(${OPENSSL_INCLUDE_DIR})
    add_definitions(-DKOAL_SSL_EXTENSION)
else()
message(WARNING "openssl not found!!")
endif()

编译生成库

add_library(MyLib STATIC MyUtil.cpp) # 生成静态库
add_library(MyLib SHARED MyUtil.cpp) # 生成动态库或共享库

编译生成可执行文件

add_executable(MyDemo MyDemo.cpp) # 生成可执行文件

判断语句

if_else

语法

if(<condition>)
  <commands>
elseif(<condition>) # optional block, can be repeated
  <commands>
else()              # optional block
  <commands>
endif()

示例

IF(${CMAKE_C_FLAGS} MATCHES "-DWIFI_PASSWD_ERR_PROMPT=1")
    target_link_libraries(pthread  wpa_client)
ENDIF(${CMAKE_C_FLAGS} MATCHES "-DWIFI_PASSWD_ERR_PROMPT=1")

调试信息

message("ssdbg"${CMAKE_C_FLAGS})
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
阿帅
红包 1 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
关于作者
阿帅

阿帅

暂无个性签名~

原创21
阅读2.2w
收藏12
点赞33
评论0
打赏用户 2
我要创作
分享技术经验,可获取创作收益
分类专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
阿帅
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区