CMake速记
title: CMake速记
date: 2019/11/18 19:17:40
toc: true
CMake速记
我的demo
#顶层
cmake_minimum_required(VERSION 3.16)
PROJECT(DCU)
SET(PLAT_FORM_THIS linux)
SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
if(PLAT_FORM_THIS STREQUAL "linux")
SET(PLAT_FORM linux)
else()
SET(PLAT_FORM arm)
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_C_COMPILER "arm-linux-gcc")
SET(CMAKE_CXX_COMPILER "arm-linux-g++")
endif()
#SET(CMAKE_SYSTEM_NAME Linux)
#SET(CMAKE_C_COMPILER "arm-linux-gcc")
#SET(CMAKE_CXX_COMPILER "arm-linux-g++")
SET(INCLUDE_DIR /home/layty/work/pan/dcu-cmake/dcu_ubuntu/dc/include)
SET(PROJECT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${PLAT_FORM}/)
# 有两个子目录
ADD_SUBDIRECTORY(third_party)
ADD_SUBDIRECTORY(dc)
#-------------------------------------------------------------------
# 子层如果还是目录的话
ADD_SUBDIRECTORY(task)
ADD_SUBDIRECTORY(thread)
#-----------------------------------------------------------------
# 子层是源文件,生成lib
INCLUDE_DIRECTORIES(${INCLUDE_DIR})
# 搜索所有源文件
AUX_SOURCE_DIRECTORY(. SRC)
# 这个是生成lib的路径
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
# 生成lib
ADD_LIBRARY(base SHARED ${SRC})
#---------------------------------------------------------------
# 子层是源文件,生成lib
INCLUDE_DIRECTORIES(${INCLUDE_DIR})
AUX_SOURCE_DIRECTORY(. SRC)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/)
ADD_EXECUTABLE(xxxexexxx ${SRC})
#链接
# 添加非标准的共享库搜索路径
LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/${PLAT_FORM}/ ${PROJECT_BINARY_DIR}/${PLAT_FORM}/lib )
#为 target 添加需要链接的共享库
TARGET_LINK_LIBRARIES(xxxexexxx pthread sqlite3 zlog crypto)
外部构建
1. mkdir build && cd build
2. cmake ..
3. make
内部变量
PROJECT_BINARY_DIR 构建目录,这里如果是外部构建这里是build
PROJECT_SOURCE_DIR 还是工程目录,也就是 cmake 后面的 .. 也就是这里是父目录
<projectname>_BINARY_DIR
<projectname>_SOURCE_DIR
基础语法
- 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
- 指令(参数 1 参数 2...)
- 指令是大小写无关的,参数和变量是大小写相关的
- 工程名
(projectname)
和可执行的文件名没有什么关系
常用指令
https://cmake.org/cmake/help/v3.16/manual/cmake-commands.7.html
PROJECT(projectname [CXX] [C] [Java])
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
ADD_EXECUTABLE (<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
#添加子目录, binary_dir为在build的重命名的生成目录
#EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除,比如,工程的example,可能就需要工程构建完成后,再进入 example 目录单独进行构建
add_subdirectory(source_dir [ binary_dir] [EXCLUDE_FROM_ALL])
#指定最终的目标二进制的位置,不包含编译生成的中间文件
# 使用add_subdirectory 的bin指定的生产的目录下有临时文件 不好看
# 在哪里 ADD_EXECUTABLE 或 ADD_LIBRARY,如果需要改变目标存放路径,就在哪里加入上述的定义
# 这样就可以指定多个 exe lib的路径
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
install(TARGETS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])
#例子
#cmake -DCMAKE_INSTALL_PREFIX=/usr .
#CMAKE_INSTALL_PREFIX 的默认定义是/usr/local
# ${CMAKE_INSTALL_PREFIX}/<DESTINATION 定义的路径>
INSTALL(TARGETS targets...
[[ARCHIVE|LIBRARY|RUNTIME] # .a,.so,.o
[DESTINATION <dir>] # 安装的路径,/开头为绝对路径,如果要使用CMAKE_INSTALL_PREFIX 指定则要用相对路径
[PERMISSIONS permissions...]
[CONFIGURATIONS
[Debug|Release|...]]
[COMPONENT <component>]
[OPTIONAL]
] [...])
# 例子
INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)
# 可执行二进制 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录
# 动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录
# 静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录
# EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
# 设置输出目标的属性
SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1 prop2 value2 ...)
#例子 将hello_static 的名字改为hello
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
# cmake 在构建一个新的 target 时,会尝试清理掉其他使用这个名字的库,因为,在构建 libhello.a 时,就会清理掉 libhello.so.
# 为了避免清理,需要再设置 CLEAN_DIRECT_OUTPUT 属性
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT1)
# 获得目标属性,变量存在VAR 如果没有这个属性定义,则返回 NOTFOUND
GET_TARGET_PROPERTY(VAR target property)
# 设置版本号
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
#头文件,默认追加在后面
#1,CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过 SET 这个 cmake 变量为 on,可以将添加的头文件搜索路径放在已有路径的前面。
#2,通过 AFTER 或者 BEFORE 参数,也可以控制是追加还是置前。
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
#链接
# 添加非标准的共享库搜索路径
LINK_DIRECTORIES(directory1 directory2 ...)
#为 target 添加需要链接的共享库
TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2...)
# ldd src/main 查看结果
#链接到静态库 加入.a
TARGET_LINK_LIBRARIES(main libhello.a)
# 当前目录的所有文件
AUX_SOURCE_DIRECTORY(dir VARIABLE)
环境变量
CMAKE_INCLUDE_PATH
CMAKE_LIBRARY_PATH
export 使用或者
CMAKE_INCLUDE_PATH=/home/include cmake ..
内部这么使用 hello.h
# FIND_PATH 用来在指定路径中搜索文件名
# #FIND_PATH(myHeader NAMES hello.h PATHS /usr/include/usr/include/hello)
FIND_PATH(myHeader hello.h)
IF(myHeader)
INCLUDE_DIRECTORIES(${myHeader})
ENDIF(myHeader)
同样的 CMAKE_LIBRARY_PATH 可以用在 FIND_LIBRARY 中
一些变量
CMAKE_CURRENT_SOURCE_DIR #指的是当前处理的 CMakeLists.txt 所在的路径
CMAKE_CURRRENT_BINARY_DIR #target 编译目录,ADD_SUBDIRECTORY(src bin)可以更改这个变量的值
CMAKE_CURRENT_LIST_FILE #输出调用这个变量的 CMakeLists.txt 的完整路径
CMAKE_CURRENT_LIST_LINE #输出这个变量所在的行
EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH #分别用来重新定义最终结果的存放目录,前面我们已经提到了这两个变量。
PROJECT_NAME #返回通过 PROJECT 指令定义的项目名称
参考文档
[x] cmake实践
[x] 快速入门指引(简书)
[ ] 一个更好的教程
CMake速记的更多相关文章
- 使用cmake自动构建工程
公司引擎是用cmake根据目标平台来构建工程的,刚接触的时候深深体会到cmake的方便:如果目标平台是windows,它可以帮你自动构建出vs工程:如果是安卓,自动构建出eclipse工程,如果是IO ...
- CMake
使用CMake编译跨平台静态库 http://www.tuicool.com/articles/3uu2Yj cmake命令 安装.用法简介 https://fukun.org/archives/04 ...
- CMake学习笔记
C++开发者必备技能CMake 先简单介绍一下,CMake是一个跨平台的编译工具,它可以根据不用的平台,不同的编译环境,生成不同的MakeFile,从而控制编译的过程. 使用CMake的步骤: 1. ...
- VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4
对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...
- cmake cannot find package
cmake 找不到package,如 find_package (OpenMesh REQUIRED) 出现错误 在项目的文件夹中找到 FindOpenMesh.cmake 文件,将其所在路径添加到 ...
- HTML5特性速记图
今天推荐大家一张HTML5特性速记图,供大家平时查阅,也可以打印放在电脑旁帮助速记.速查.此图笔者收集于网络图片.
- Golang语法与代码格式速记【转】
// Description: Golang语法与代码格式速记 // Author: cxy // Date: 2013-04-01 // Version: 0.3 // TODO 说明 // TOD ...
- Cmake的交叉编译
http://www.cmake.org/Wiki/CMake_Cross_Compiling
- CMake命令/函数汇总(翻译自官方手册)
查看官方文档 cmake命令 选项 CMake变量 CMake命令汇总 / add_custom_command add_custom_target/add_definitions/add_depen ...
随机推荐
- 利用Js的console对象,在控制台打印调式信息测试Js
一次偶然的机会,打开百度的时候按下了F12,然后就见控制台里面输出了百度的招聘广告,感觉挺帅气的,再然后就有了这篇博文. 既然可以这样在控制台输出信息,那以后再调试Js的时候不就可以省去很多麻烦了嘛! ...
- 11、Spring Boot 2.x 集成 HBase
1.11 Spring Boot 2.x 集成 HBase 完整源码: Spring-Boot-Demos
- //点击按钮加减音频音量到最小会出现bug什么意思???
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SIGAI深度学习第一集 机器学习与数学基础知识
SIGAI深度学习课程: 本课程全面.系统.深入的讲解深度学习技术.包括深度学习算法的起源与发展历史,自动编码器,受限玻尔兹曼机,卷积神经网络,循环神经网络,生成对抗网络,深度强化学习,以及各种算法的 ...
- Shell 脚本语法
条件测试:test 和 [ 命令 test 或 [ 可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为1(注意与C ...
- 【luogu4145】上帝造题的七分钟2 / 花神游历各国--区间开根-线段树
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- python基础-跨域问题
跨域 -- 浏览器的同源策略 阻止ajax请求 不阻止src请求 -- jsonp -- 我们利用src发送请求 -- core -- class MyCore(MiddlewareMixin): d ...
- cmake 学习-cmakelists.txt
#设置库的路径,电脑里有qt4以及qt5,使用qt5时 设置qt5的环境变量(路径). set(CMAKE_PREFIX_PATH $ENV{QTDIR}) #设定工程名称 Project(prona ...
- 二十八、CentOS系统光盘安装、anaconda概述
常见问题你会感觉 tftp timeout: 防火墙 time out script: 网关没有指定,在dhcpd.conf中 不能下载:vmlinuz和initrd程序和安装的系统版本不一致 内存必 ...
- Python学习日记(九)—— 模块二(logging、json&pickle、xml、requests、configparser、shutil、subprocess)
logging模块 用于便捷记录日志且线程安全的模块(便捷的写文件的模块,不允许多个人同时操作文件) 1.单文件日志 import logging logging.basicConfig(filena ...