新手,入门阅读 CMakeLists,希望读者能给点建议

发现两篇文章,我感觉很好~

《阅读 CMakeLists》(下面只copy此篇)文章来源:http://blog.sina.com.cn/s/blog_8380edd00100wyei.html

《CMake 入门实战》 文章地址:http://www.hahack.com/codes/cmake/

楼主最近几天被Orz和PageGeometry弄得有点头大,需要通过源码 + CMakeLists 来建立工程和sln,但是到底CMakeLists.txt 里写的是些什么东西呢。

【语法】

注释  # :   
    #我是注释

命令语法 COMMAND:
    COMMAND(参数1 参数2 ...)

字符串列

A;B;C           //分号分割或空格分隔的值

变量
    set(Foo a b c)             // 设置变量 Foo
    command(${Foo})     //等价于 command(a b c)
    command("${Foo}")  // 等价于 command("a b c")
    command("/${Foo}") // 转义,和 a b c无关联

流控制结构
    IF()...ELSE()  /ELSEIF()...ENDIF()
    WHILE()...ENDWHILE()
    FOREACH()...ENDFOREACH()

【常用命令】

(按A~Z排列)

ADD_EXECUTABLE
add_exectuable  : 工程生成一个可执行文件。
add_executable(hello ${SRC_LIST})  //生成一个名为hello.exe的可执行文件

ADD_LIBRARY
add_library :  生成一个库文件。
add_library(libhello ${LIB_SRC})                  //生成libhello.lib文件
add_library(libhello SHARED ${LIB_SRC})  //生成动态库文件

ADD_CUSTOM_TARGET
自定义目标,生成一个自定义文件类型

add_subdirectory :增加子文件夹,2个参数的话就是 源→目标 文件夹生成对应 
add_subdirectory(src) :建立src子文件夹
add_subdirectory(src bin)  :在cmake目标文件夹中与源文件夹对应 src→bin文件夹

ADD_DEPENDENCIES( target1 t2 t3 )
目标target1依赖于t2 t3

ADD_DEFINITIONS( "-Wall -ansi")
本意是供设置 -D... /D... 等编译预处理需要的宏定义参数,对比 REMOVE_DEFINITIONS()

AUX_SOURCE_DIRECTORY ( “sourcedir” variable)
收集目录中的文件名并赋值给变量

EXEC_PROGRAM ( bin [work_dir] ARGS <..> [OUTPUT_VARIABLE var] [RETURN_VALUE var] )
 执行外部程序

FILE ( WRITE|READ|APPEND|GLOB| GLOB_RECURSE|REMOVE|MAKE_DIRECTORY ...)
文件操作

FIND_FILE
FIND_PATH
FIND_LIBRARY
FIND_PACKAGE
    上述4个注意 CMAKE_LIBRARY_PATH

FIND_PROGRAM

INCLUDE_DIRECTORIES ( "dir1" "dir2" ... )
include_directories  : 包含指定目录下的指定文件夹
include_directories(${PROJECT_SOURCE_DIR}/libhello)  //包含当前目录下的libhello文件夹

INSTALL ( FILES “f1” “f2”DESTINATION . )
DESTINATION (目标文件夹)相对于 ${CMAKE_INSTALL_PREFIX}
 
LINK_DIRECTORIES ("dir1" "dir2")
 库文件路径。注意:由于历史原因,相对路径会原样传递给链接器。尽量使用FIND_LIBRARY而避免使用这个。
 
LINK_LIBRARIES ( lib1 lib2 ...)
设置所有目标需要链接的库

LIST ( APPEND|INSERT|LENGTH|GET| REMOVE_ITEM|REMOVE_AT|SORT ...)
列表操作

MESSAGE (...)  输出信息,方便检查调试

message(${PROJECT_SOURCE_DIR})

project

建立一个工程
project   不是强制性的,但最好始终都加上。这一行会引入两个变量
•HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR
同时,cmake自动定义了两个等价的变量
•PROJECT_BINARY_DIR   和  PROJECT_SOURCE_DIR
如果是out-of-source方式构建(源代码和生成的中间产物分离),所以要时刻区分这两个变量对应的目录

SET
set (SRC_LIST hello.cpp)  //源文件列表 hello.cpp
set (APP_SRC main.c)       //语义基本同上,具体不太了解
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)  //指定生成hello.exe到目标文件夹

SET_TARGET_PROPERTIES ( ... ): 设置目标的属性 OUTPUT_NAME, VERSION, ....
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")  //使libhello.lib输出文件名为hello.exe

SEPARATE_ARGUMENTS ( VAR )
转换空格分隔的字符串到列表

STRING ( TOUPPER|TOLOWER|LENGTH| SUBSTRING|REPLACE|REGEX ...)
字符串操作

TARGET_LINK_LIBRARIES ( target-name lib1 lib2 ...)
target_link_libraries  :  将指定库文件链接到某个执行文件
target_link_libraries(hello libhello)   //将libhello.lib文件链接到hello.exe

【常见变量】

----工程路径------

•CMAKE_SOURCE_DIR
•PROJECT_SOURCE_DIR
•<projectname>_SOURCE_DIR
这三个变量指代的内容是一致的,是工程顶层目录

•CMAKE_BINARY_DIR
•PROJECT_BINARY_DIR
•<projectname>_BINARY_DIR
这三个变量指代的内容是一致的,如果是in source编译,指得就是工程顶层目录,如果  是out-of-source编译,指的是工程编译发生的目录

•CMAKE_CURRENT_SOURCE_DIR
指的是当前处理的CMakeLists.txt所在的路径。

•CMAKE_CURRRENT_BINARY_DIR
如果是in-source编译,它跟CMAKE_CURRENT_SOURCE_DIR一致,如果是out-ofsource  编译,他指的是target编

译目录。

•CMAKE_CURRENT_LIST_FILE
输出调用这个变量的CMakeLists.txt的完整路径

----CMAKE_BUILD_TYPE-----

控制 Debug 和 Release 模式的构建

•CMakeList.txt文件
SET(CMAKE_BUILD_TYPE Debug)•命令行参数
cmake DCMAKE_BUILD_TYPE=Relea

-----编译器参数-----

•CMAKE_C_FLAGS
•CMAKE_CXX_FLAGS
也可以通过指令ADD_DEFINITIONS()添加

CMAKE_INCLUDE_PATH
配合 FIND_FILE() 以及 FIND_PATH() 使用。如果头文件没有存放在常规路径/usr/include, /usr/local/include等),
则可以通过这些变量就行弥补。如果不使用 FIND_FILE 和 FIND_PATH的话,CMAKE_INCLUDE_PATH,没有任何作

用。

•CMAKE_LIBRARY_PATH

配合 FIND_LIBRARY() 使用。否则没有任何作用

•CMAKE_MODULE_PATH

cmake 为上百个软件包提供了查找器(finder):FindXXXX.cmake

当使用非cmake自带的finder时,需要指定finder的路径,这就是CMAKE_MODULE_PATH,配合 FIND_PACKAGE

()使用

CMAKE_INSTALL_PREFIX
控制make install是文件会安装到什么地方。默认定义是/usr/local 或 %PROGRAMFILES%

BUILD_SHARED_LIBS
如果不进行设置,使用ADD_LIBRARY且没有指定库类型,默认编译生成的库是静态库。

UNIX 与 WIN32
•UNIX,在所有的类UNIX平台为TRUE,包括OS X和cygwin
•WIN32,在所有的win32平台为TRUE,包括cygwin

更多CMake信息参考

学习如何写CMakeLists参考如下网址,写的不错

阅读 CMakeLists的更多相关文章

  1. ncnn阅读 - CMakeLists.txt

    CMAKE_TOOLCHAIN_FILE This variable is specified on the command line when cross-compiling with CMake. ...

  2. Ubuntu安装FreeSWITCH亲测

    本人在安装FreeSWITCH的时候遇到了相当多的坑,网上很多方法都模棱两可,经常装失败,最后终于装成功后做一下总结 最顺利的安装方式 1. 下载压缩文件 下载地址:http://files.free ...

  3. px4的CMakelists.txt阅读

    ############################################################################ # # Copyright (c) PX4 D ...

  4. FreeCAD源码阅读笔记

    本文目标在于记录在FreeCAD源码阅读中了解到的一些东西. FreeCAD编译 FreeCAD源码的编译最好使用官方提供的LibPack,否则第三方库难以找全,找到之后还需要自己编译,此外还不知道C ...

  5. Linux下如何阅读开源项目

    标签(空格分隔): code SLAM是一个大型的项目,而且通常都是基于linux平台的.对于大部分没有linux经验的人来说,如何在linux下拥有vs代码阅读体验就非常重要了.这篇博客就简答的介绍 ...

  6. Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...

  7. pytorch下的lib库 源码阅读笔记(1)

    置顶:将pytorch clone到本地,查看initial commit,已经是麻雀虽小五脏俱全了,非常适合作为学习模板. 2017年12月7日01:24:15 2017-10-25 17:51 参 ...

  8. 将cmake文件转化为vs方便代码阅读与分析

    下面通过“chengxuyuancc”同学的图来说明.通过cmake将winafl cmake编译方式转化为vs2015,方便源码阅读与分析. 1.到官网下载cmake软件.启动图形版 2.选择源码目 ...

  9. CMake之CMakeLists.txt编写入门

    自定义变量 主要有隐式定义和显式定义两种. 隐式定义的一个例子是PROJECT指令,它会隐式的定义< projectname >_BINARY_DIR和< projectname & ...

随机推荐

  1. c# 计算时间差---天数

    ---处理两个时间相差的天数 测试数据:三个时间 DateTime dt1 = Convert.ToDateTime("2017-03-17 09:49:55.667"); Dat ...

  2. Item 12 考虑实现Comparable接口

    1.Comparable接口,用来做什么. 2.判定类实现的Comparable接口是否正确的方法. 3.不要扩展一个已经实现了Comparable接口的类来增加用于比较的值组件.     1.Com ...

  3. lua 闪电特效

    闪电特效 根据不同的起点 终点 资源做倾斜 拉伸 ,主要是计算倾斜角度. function ZyLight:show(params) local params = params or {} local ...

  4. this可以通过call改变的测试

  5. spring boot web 入门

    ① 新建一个maven项目. ② pom中parent设为 spring-boot-starter-parent .建议使用最新的 RELEASE 版本.否则可能需要设置 <repositori ...

  6. javascript中数据属性与访问器属性

    1.数据属性 Configurable:true|false,表示能否通过delete将属性删除,默认为true.当把属性的Configurable设置为false后,该属性不能通过delete删除, ...

  7. java===java基础学习(3)---数据类型转换,运算符级别,枚举类型

    数据类型转换: 有的时候,程序需要将数据类型,比如 int + float ,结果是float, 这里的int就被转换为float类型,属于合法转换. Java中的合法转换如下图: 红色表示无信息丢失 ...

  8. sql server查看创建表的代码,表定义

    1.查看建表语句在“对象资源管理器”中找到要导出的表,选中该表并单击右键,“编写表脚本为(S)”/“CREATE到(C)”/“新查询编辑器窗口”即可查看该表的建表语句.2.导出建表语句在“对象资源管理 ...

  9. 【HDU3037】Saving Beans

    Lucas的裸题,学习一个. #include<bits/stdc++.h> #define N 100010 using namespace std; typedef long long ...

  10. 3.Python3标准库--数据结构

    (一)enum:枚举类型 import enum ''' enum模块定义了一个提供迭代和比较功能的枚举类型.可以用这个为值创建明确定义的符号,而不是使用字面量整数或字符串 ''' 1.创建枚举 im ...