1 # CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

2 项目信息
project (Demo2)

3 aux_source_directory 查找当前目录下的所有源文件并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

4 add_executable 工程生成目标文件
add_executable(Demo ${DIR_SRCS})

5 target_link_libraries 将若干库链接到目标库文件
target_link_libraries(myProject comm) # 连接libhello.so库,默认优先链接动态库
target_link_libraries(myProject libcomm.a) # 显示指定链接静态库
target_link_libraries(myProject libcomm.so) # 显示指定链接动态库
target_link_libraries(<name> lib1 lib2 lib3)
链接的顺序应当符合gcc链接顺序规则,被链接的库放在依赖它的库的后面,即如果上面的命令中,lib1依赖于lib2, lib2又依赖于lib3,则在上面命令中必须严格按照lib1 lib2 lib3的顺序排列,否则会报错
也可以自定义链接选项, 比如针对lib1使用-WL选项,target_link_libraries(<name> lib1 -WL, lib2 lib3)

6 add_library 生成静态链接库和动态库
add_library(libname [SHARED|STATIC] source1 source2 ... sourceN)
add_library (hello STATIC ${LIBHELLO_SRC}) #生成静态链接库
add_library (hello SHARED ${LIBHELLO_SRC}) #生成动态链接库

7 SET_TARGET_PROPERTIES 设置输出别名,所以,希望 "hello_static" 在输出时,不是"hello_static",而是以"hello"的名字显示,故设置如下
SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello")
GET_TARGET_PROPERTY (OUTPUT_VALUE hello_static OUTPUT_NAME) #获取值

8 include_directories 设置头文件位置,相当于g++ -I,可以用相对货绝对路径,也可以用自定义的变量值
include_directories(../../../thirdparty/comm/include)

9 link_directories 添加需要链接的库文件目录,它相当于g++命令的-L选项的作用
link_directories(directory1 directory2 ...)
例:link_directories("/home/server/third/lib")

10 link_libraries 添加需要链接的库文件路径
语法:
link_libraries(library1 <debug | optimized> library2 ...)
# 直接是全路径
link_libraries(“/home/server/third/lib/libcommon.a”)
# 下面的例子,只有库名,cmake会自动去所包含的目录搜索
link_libraries(iconv)
# 传入变量
link_libraries(${RUNTIME_LIB})
# 也可以链接多个
link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")

11 SET_TARGET_PROPERTIES 用来设置输出的名称
SET_TARGET_PROPERTIES (target1 target2 ...PROPERTIES prop1 value1 prop2 value2 ...)
SET_TARGET_PROPERTIES (hello PROPERTIES VERSION 1.2 SOVERSION 1) 实现动态库版本号 VERSION指代动态库版本,SOVERSION指代API版本。
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") 将libhello_static.a库名称输出为libhello.a

12 GET_TARGET_PROPERTY 获取属性值
GET_TARGET_PROPERTY (VAR target property) VAR:变量 target:目标 property:属性
GET_TARGET_PROPERTY (OUTPUT_VALUE hello_static OUTPUT_NAME)

13 MESSAGE 打印cmake时信息
MESSAGE (STATUS "This is the hello_static OUTPUT_NAME: " ${OUTPUT_VALUE})

14 add_library 导入已有的库
add_library(<name> [STATIC | SHARED | MODULE | UNKNOWN] IMPORTED)
导入了一个已存在的<name>库文件,导入库一般配合set_target_properties使用,这个命令用来指定导入库的路径,比如:
add_library(test SHARED IMPORTED)
set_target_properties( test #指定目标库名称
PROPERTIES IMPORTED_LOCATION #指明要设置的参数
libs/src/${ANDROID_ABI}/libtest.so #设定导入库的路径)

15 set
# 设置可执行文件的输出路径(EXCUTABLE_OUTPUT_PATH是全局变量)
set(EXECUTABLE_OUTPUT_PATH [output_path])
# 设置库文件的输出路径(LIBRARY_OUTPUT_PATH是全局变量)
set(LIBRARY_OUTPUT_PATH [output_path])
# 设置C++编译参数(CMAKE_CXX_FLAGS是全局变量)
set(CMAKE_CXX_FLAGS "-Wall std=c++11")
# 设置源文件集合(SOURCE_FILES是本地变量即自定义变量)
set(SOURCE_FILES main.cpp test.cpp ...)
# 设置编译类型debug 或者release。 debug 版会生成相关调试信息,可以使用GDB 进行调试;release不会生成调试信息
set(CMAKE_BUILE_TYPE DEBUG)
# 设置编译器的类型
SET(CMAKE_C_FLAGS_DEBUG “-g -Wall”)
# 设置低版本g++编译器支持c++11,高版本自动识别
set(CMAKE_CXX_STANDARD 11)

需要注意的是,在哪里 ADD_EXECUTABLE 或 ADD_LIBRARY,如果需要改变目标存放路径,就在哪里的上面加入上述的定义

16 add_subdirectory
如果当前目录下还有子目录时可以使用add_subdirectory,子目录中也需要包含有CMakeLists.txt
# sub_dir指定包含CMakeLists.txt和源码文件的子目录位置
# binary_dir是输出路径, 一般可以不指定
add_subdirecroty(sub_dir [binary_dir])

17 文件操作命令file
# 将message写入filename文件中,会覆盖文件原有内容
file(WRITE filename "message")
# 将message写入filename文件中,会追加在文件末尾
file(APPEND filename "message")
# 重命名文件
file(RENAME <oldname> <newname>)
# 删除文件, 等于rm命令
file(REMOVE [file1 ...])
# 创建目录
file(MAKE_DIRECTORY [dir1 dir2 ...])
#这个命令将把该目录下及所有子文件夹内的所有后缀为.cpp的文件的路径,全部放入SRC_LIST这个变量中

file(GLOB_RECURSE SRC_LIST "*.cpp")
file(GLOB_RECURSE HEADERS "*.h")
file(GLOB_RECURSE FORMS "*.ui")
file(GLOB_RECURSE RESOURCES "*.qrc")

18 set_directory_properties 设置某个路径的一种属性
set_directory_properties(PROPERTIES prop1 value1 prop2 value2)
prop1 prop代表属性,取值为:
INCLUDE_DIRECTORIES
LINK_DIRECTORIES
INCLUDE_REGULAR_EXPRESSION
ADDITIONAL_MAKE_CLEAN_FILES

19 find_library 查找库所在目录,并将查找到路径放入到变量中
find_library(RUNTIME_LIB_VAR rt /usr/lib /usr/local/lib NO_DEFAULT_PATH)
cmake会在目录中查找,如果所有目录中都没有,值RUNTIME_LIB_VAR就会被赋为NO_DEFAULT_PATH

20 add_definitions
向 C/C++编译器添加-D 定义,比如:
add_definitions(-DENABLE_DEBUG -DABC),参数之间用空格分割。
如果你的代码中定义了#ifdef ENABLE_DEBUG #endif,这个代码块就会生效

21 add_dependencies
定义 target 依赖的其他 target,确保在编译本 target 之前,其他的 target 已经被构建。
add_dependencies(target-name depend-target1
depend-target2 ...)

语法说明:
CMakelist中,命令名字是不区分大小写的,而参数和变量是大小写相关的。
CMake中使用"#"表示注释该行代码。
使用${}进行变量的引用
SET(变量 值) 自定义变量

变量说明:
PROJECT_NAME 返回通过 PROJECT 指令定义的项目名称。
PROJECT_SOURCE_DIR==<projectname>_SOURCE_DIR 指向的是<项目目录>
PROJECT_BINARY_DIR==<projectname>_BINARY_DIR 指向的是<项目目录>/build目录
CMAKE_CURRENT_SOURCE_DIR 指的是当前处理的 CMakeLists.txt 所在的路径,比如上面我们提到的 src 子目录
CMAKE_MODULE_PATH 这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设置一下。
比如:
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
这时候你就可以通过 INCLUDE 指令来调用自己的模块了

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8) # 项目信息
project (DEMO)
# 查找目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
#aux_source_directory(./src DIR_SRCS)
include_directories(./include)
# 添加 math 子目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
add_subdirectory(src)
link_libraries(MathFunctions)
link_directories(/home/qilin64/Documents/work/demo/libs)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) # 指定生成目标
add_executable(Demo ${DIR_SRCS}) # 添加链接库
#target_link_libraries(Demo MathFunctions)

  

file操作:
message(STATUS "current dir: ${CMAKE_CURRENT_SOURCE_DIR}")
file(WRITE test1.txt "Some messages to Write\n" )
file(APPEND test1.txt "Another message to write\n")
file(READ test1.txt CONTENTS LIMIT OFFSET )
message(STATUS "contents of test1.txt is: \n ${CONTENTS}")
file(MD5 ${CMAKE_CURRENT_SOURCE_DIR}/test1.txt HASH_CONTENTS)
message(STATUS "hash contents of test1.txt is: \n ${HASH_CONTENTS}")
file(STRINGS test1.txt PARSED_STRINGS)
message(STATUS "\n strings of test1.txt is: \n ${PARSED_STRINGS}")
file(GLOB files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.*")
message(STATUS "files: ${files}")
file(MAKE_DIRECTORY dir1 dir2)
file(RENAME dir2 dir3)
file(REMOVE dir3)
file(REMOVE_RECURSE dir3)
file(RELATIVE_PATH relative_path ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/test1.txt)
message(STATUS "relative path : ${relative_path}")
file(TO_CMAKE_PATH "$ENV{PATH}" cmake_path)
message(STATUS "cmake path: ${cmake_path}")
file(TO_NATIVE_PATH "/usr/local/sbin;/usr/local/bin" native_path)
message(STATUS "native path: ${native_path}")
file(DOWNLOAD "http://www.baidu.com" ${CMAKE_CURRENT_SOURCE_DIR}/index.html SHOW_PROGRESS)
file(COPY test1.txt DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/dir1)
file(INSTALL test1.txt DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/dir1)

cmake 基本命令的更多相关文章

  1. Clion+Cmake+Qt5+Qwt+msys2+MinGW在Windows下的安装配置使用教程

    摘要: CLion, a cross-platform C/C++ IDE. 本文主要介绍基于Clion作为IDE, MinGW作为编译器,CMake作为项目构建工具,开发基于Qt5.qwt的C++图 ...

  2. android studio使用CMake和NDK,实现应用自身被卸载时打开某一网址

    实现应用自身被卸载时打开某一网址的c代码 MyActivity: public class MyActivity extends Activity { /** * Called when the ac ...

  3. AndroidStudio用Cmake方式编译NDK代码(cmake配置.a库)

    1.cmake是什么? CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C+ ...

  4. CMake最好的学习资料

    本文为转载,阅读不友好,请先查看原文:https://blog.gmem.cc/cmake-study-note 收下为原文内容================> 基础知识 CMake简介 CM ...

  5. MySQL基本命令操作及数据库基本概念

    MySQL基本命令操作及数据库基本概念 1.数据库的基本概念 2.主流数据库介绍 3.关系型非关系型数据库介绍 4.Mysql 安装方法 5.Mysql 基本操作命令 1.数据库的基本概念: 数据库的 ...

  6. CMake技术总结

    在做算法部署的过程中,我们一般都是用C++开发,主要原因是C++的高效性,而构建维护一个大型C++工程的过程中,如何管理不同子模块之间的依赖.外部依赖库.头文件和源文件如何隔离.编译的时候又该如何相互 ...

  7. 使用cmake自动构建工程

    公司引擎是用cmake根据目标平台来构建工程的,刚接触的时候深深体会到cmake的方便:如果目标平台是windows,它可以帮你自动构建出vs工程:如果是安卓,自动构建出eclipse工程,如果是IO ...

  8. CMake

    使用CMake编译跨平台静态库 http://www.tuicool.com/articles/3uu2Yj cmake命令 安装.用法简介 https://fukun.org/archives/04 ...

  9. CMake学习笔记

    C++开发者必备技能CMake  先简单介绍一下,CMake是一个跨平台的编译工具,它可以根据不用的平台,不同的编译环境,生成不同的MakeFile,从而控制编译的过程. 使用CMake的步骤: 1. ...

随机推荐

  1. 修改WAMPServer(Apache+PHP+MySQL一键式安装)中mysql默认空密码

    Note:在EclipsePHP中配置WorkSpace时,将工作目录指到执行PHP代码的www目录下 ,便于在Eclipse下编写PHP项目          eg:D:\KelvinSoftwar ...

  2. puppet的使用:ERB模板

    ERB介绍 全称是Embedded RuBy,意思是嵌入式的Ruby,是一种文本模板技术,用过JSP的话,会发现两者语法很像. 我们项目中一般用ERB来产生各模块的配置文件.ERB模板也可以用来产生W ...

  3. 解析ASP.NET WebForm和Mvc开发的区别 分类: ASP.NET 2013-12-29 01:59 11738人阅读 评论(5) 收藏

    因为以前主要是做WebFrom开发,对MVC开发并没有太深入的了解.自从来到创新工场的新团队后,用的技术都是自己以前没有接触过的,比如:MVC 和EF还有就是WCF,压力一直很大.在很多问题都是不清楚 ...

  4. javac之BridgeMethod及泛型擦除重写

    When compiling a class or interface that extends a parameterized class or implements a parameterized ...

  5. webpack4重新梳理一下

    webpack安装和使用 mkdir webpack_demo cd webpack_demo //npm初始化 npm init //然后一直回车 安装webpack // 不建议全局安装 cnpm ...

  6. 正确的C++/C堆栈

    在理解C/C++内存分区时,常会碰到如下术语:数据区,堆,栈,静态存储区,静态区,常量区,常变量区,全局区,字符串常量区,静态常量区,静态变量区,文字常量区,代码区等等,初学者被搞得云里雾里.在这里, ...

  7. OOAD之单例模式Singleton的6种写法

    1  主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 一 :第一种 饿汉式(预加载) public class Singleton { private Singleton(){ ...

  8. 4.3 数据操纵语言(DML)

    本章介绍DML的基本语句. 对数据只能执行以下四种操作:创建(Create)记录.读取(Read)记录.更新(Update)记录值和删除(Delete)记录.这几个词拼写为CRUD——即可对数据执行C ...

  9. 008.在C#中,显式接口VS隐式接口

    原文http://www.codeproject.com/Articles/1000374/Explicit-Interface-VS-Implicit-Interface-in-Csharp (At ...

  10. JVM原理自总结

    一.成熟的系统调优1.一定要绝对避免循环查数据库和缓存(PS:循环里面就不能有查询缓存,更不能有查询数据库的操作,因为循环的次数没法控制) 2.对于API接口的话,一般都是直接查缓存的,没有查数据库的 ...