CMake编译规则梳理
文章目录
概述
本文讲述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选项,那么
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})
- 分享
- 举报
-
浏览量:762次2024-01-25 14:44:37
-
2024-02-23 16:20:11
-
浏览量:817次2024-05-27 15:28:18
-
浏览量:9871次2020-12-05 14:15:53
-
浏览量:1628次2021-12-07 09:52:19
-
浏览量:712次2023-11-30 17:09:29
-
浏览量:33614次2021-02-02 16:24:27
-
2020-09-28 11:34:56
-
浏览量:1377次2023-11-03 17:39:10
-
浏览量:6594次2021-03-25 09:46:49
-
浏览量:2627次2023-10-17 17:23:21
-
浏览量:2159次2024-02-05 15:51:53
-
浏览量:1069次2024-01-22 17:02:06
-
浏览量:812次2024-01-24 16:33:36
-
浏览量:863次2024-02-04 10:08:58
-
浏览量:1029次2024-01-03 17:15:03
-
2024-02-04 10:33:53
-
2024-01-05 17:19:54
-
浏览量:582次2024-01-24 14:47:22
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
阿帅
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明