实例-1

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)  #声明Cmake版本,如果低于指定版本则会停止处理工程文件,并报告错误
PROJECT(XXX) SET(CMAKE_BUILD_TYPE Release)
SET(CMAKE_CXX_FLAGS "-std=c++11 -O2 -mfloat-abi=hard -mfpu=neon") #micro
#ADD_DEFINITIONS( -DDDDDDDDD) #include and libs path
SET(INCLUDE_PATH . ../ /usr/include/eigen3 /srv/boost_1_63_0 ) SET(LINK_PATH /srv/boost_1_63_0/stage/lib ) INCLUDE_DIRECTORIES(${INCLUDE_PATH})
LINK_DIRECTORIES(${LINK_PATH} ) #source files in dir #dir CommonH
AUX_SOURCE_DIRECTORY(filepath name) #execuable
ADD_EXECUTABLE(XX mainV2.cpp ${name} ) TARGET_LINK_LIBRARIES(XX libnames)

指令说明

CMAKE_MINIMUM_REQUIRED(VERSION major[.minor[.patch[.tweak]]] [FATAL_ERROR])

声明Cmake版本,如果低于指定版本则会停止处理工程文件,并报告错误

PROJECT(PROJECTNAME [CXX] [C])

[指定工程支持的语言,如果忽略,表示支持所有语言]

ADD_EXECUTABLE([WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 ...)

引入一个名为的可执行目标,该目标会由调用该命令时在源文件列表中指定的源文件来构建。对应于逻辑目标名字,并且在工程范围内必须是全局唯一的,如果构成可执行文件的源文件很多,

AUX_SOURCE_DIRECTORY(. DIRSRCS)

则可以指定一个源文件列表或者添加文件夹内所有文件

CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
PROJECT(Hello) SET (SRC_LIST main.cpp v4l2_util.cpp tran_data.cpp)
MESSAGE(${SRC_LIST})
ADD_EXECUTABLE(Hello ${SRC_LIST})

ADD_EXECUTABLE:可执行程序由哪些.o文件生成

实例-2 编译静态库,并让主程序调用静态库最终生成一个可执行程序

即先生成一个hello.a,再让主程序main.cpp使用libhello.a,最终生成Hello

CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
PROJECT(Hello)
SET(LIB_SRC_LIST source1.cpp source2.cpp)
SET(EXEC_SRC_LIST main.cpp)
ADD_LIBRARY(LIB STATIC ${LIB_SRC_LIST})
ADD_EXECUTABLE(Test_Hello ${EXEC_SRC_LIST})
TARGET_LINK_LIBRARIES(Test_Hello LIB)

创建一个名字name的库文件,SHARED STATIC 制定生成库的类型

ADD_LIBRARY(NAME [STATIC| SHARED|MODULE] [EXCLUDE_FROM_ALL] source1, source2,...) 

将给定的库链接到target上,默认优先链接动态库,类似于静态链接,必须放置在ADD_EXECUTABLE后面,否则都会出现undefied reference函数

TARGET_LINK_LIBRARIES(target [item1 [item2] [ ...] ]),LINK_DIRECTORIES

  • 指定include路径

一般情况下,src和include为同级目录,需要指定include路径src才可以正确定位头文件

SET(INCLUDE_DIRECTORIES " ../include")
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES})

它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。

  • 添加第三方库,不需要编译,将他放在resource目录下,需要指定搜索库路径
SET(LINK_DIR "../../resource")
LINK_DIRECTORIES(${LINK_DIR })

相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。

如果想设置更多的关于动态库的参数例如: -Wl,-rpath=usr/local/lib

LINK_LIBRARY("/usr/local/lib")
ADD_EXECUTABLE(main main.c)
  • 创建Release和Debug版本
SET(CMAKE_BUILD_TYPE Release)
SET(CMAKE_BUILD_TYPE Debug)

二者模式区别在于

Release: -O3 -DNDEBUG
Debug: -g

也可不加在MakeFiles.txt里面,在产生Makefiles时候才加入

cmake -DCMAKE_BUILD_TYPE=Release

#增加编译和链接选项

CMAKE_C_FLAGS
CMAKE_CXX_FLAGS
CMAKE_EXE_LINKER_FLAGS

分别相当于:CFLAGS, CXXFLAGS, LDFLAGS。

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEMBED")

这种写法的好处是,不会覆盖CMAKE_CXX_FLAGS本来的信息。只是把需要添加的内容添加进去

Debug和Release版本:

关键在于三个CMake设置:

CMAKE_BUILD_TYPE

CMAKE_CXX_FLAGS_DEBUG, CMAKE_CXX_FLAGS_RELEASE

当CMAKE_BUILD_TYPE设置为Debug。 则编译时采用CMAKE_CXX_FLAGS_DEBUG。

当CMAKE_BUILD_TYPE设置为Release。 则编译时采用CMAKE_CXX_FLAGS_RELEASE

例如

cmake_minimum_required (VERSION 2.6)
project (CMAKE_Test)
add_executable(CMAKE_Test src/banchmark.cpp)
#set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -Wno-unused-but-set-variable")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -Wno-unused-but-set-variable")
  • 多目录结构的cmake使用

Hello 实际的目录结构其实并不是所有源码都存放在src目录内。它的目录结构是:

src: 存放生成库的源码。source1.cpp, source2.cpp
test:存放使用库的测 试程序: main.cpp
include: 存放头文件: source1.h
resource: 存放第三方库
build:存放编译过程的文件
build/lib: 存放生成的libv4l2_utils.so
build/bin:存放main.cpp所产生的测试程序可执行文件。

此时,可以采用顶层目录和每个有源码的目录中均创建CMakeLists.txt的方式来处理(和Makefile处理方式类似),顶层目录的CMakeLists.txt 内容如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(Hello)
ADD_SUBDIRECTORIES(src lib)
ADD_SUBDIRECTORIES(test bin)

构建添加一个子路径

ADD_SUBDIRECTORIES([source dir] [bin dir] [exclude_from_all])

source_dir选项指定了CMakeLists.txt源文件和代码文件的位置。如果source_dir是一个相对路径,那么source_dir选项会被解释为相对于当前的目录,但是它也可以是一个绝对路径。binary_dir选项指定了输出文件的路径。如果binary_dir是相对路径,它将会被解释为相对于当前输出路径。

SOURCE_DIR算相对路径时,是从CMakeLists.txt算起。所以src指的是当前 CMakeLists.txt所在路径下的src. 而bin, lib 指的是当前输出路径下的bin,lib. 也就是build/bin build/lib

src CMakeLists.txt :

SET(LIB_SRC_LIST source1.cpp)
SET(CMAKE_BUILD_TYPE Release)
INCLUDE_DIRECTORIES(../include)
ADD_LIBRARY(SOURCE1 SHARED ${LIB_SRC_LIST})

test CMakeLists.txt :

SET(EXEC_SRC_LIST main.cpp)
SET(INCLUDE_DIRECTORIES ../include)
SET(LINK_DIR ../../resource)
SET(LINK_DIR "${LINK_DIR} ../../libs/")
SET(CMAKE_BUILD_TYPE Release)
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES})
LINK_DIRECTORIES(${LINK_DIR})
ADD_EXECUTABLE(Test_Hello ${EXEC_SRC_LIST})
TARGET_LINK_LIBRARIES(Test_Hello SOURCE1 )
文件移动

将某一个工程放置于某一个文件夹下(指的是工程位于某目录下)

SET_PROPERTY(TARGET NetLib PROPERTY FOLDER "Common")

NetLib移动到Common文件夹下

INSTLLL(FILES ${CMAKE_LINK_PATH}/odbc/libodbc.so DESTINATION bin)

将动态库移动到bin目录下

显示编译细节

SET(CMAKE_VERBOSE_MAKEFILE ON)

如果不希望改变CMakeLists.txt,可以在创建Makefile时候加入

cmake -DCMAKE_VERBOSE_MAKEFILE=ON

如果连Makefile都不希望修改可以:make VERBOSE=1

相对路径问题:

set (LIBRARY_DIRECTORIES ../resource)
link_directories(${LIBRARY_DIRECTORIES})

这里会出警告:

This command specifies the relative path:../resource

可以做如下处理:

SET(LIBRARY_DIRECTORIES ../resource)
LINK_DIRECTORIES($PROJECT_SOURCE_DIR}/${LIBRARY_DIRECTORIES})

但是如果LIBRARY_DIRECTORIES 是个列表的话,此种方式仍然会引起警告。

CMAKE_CURRENT_SOURCE_DIR
CMAKE_CURRENT_BINARY_DIR
PROJECT_SOURCE_DIR
PROJECT_BIANRY_DIR

内部编译时,以上四种变量没有区别,都是CMakeLists.txt所在位置

外部编译时

CMAKE_CURRENT_BINARY_DIR
PROJECT_BIANRY_DIR

在build文件夹

FIND_PACKAGE()

可以被用来在系统中自动查找配置构建工程所需的程序库。在linux和unix类系统下这个命令尤其有用。CMake自带的模块文件里有大半是对各种常见开源库的find_package支持,支持库的种类非常多,例如

FIND_PACKAGE(Qt5Widgets)

FIND_PACKAGE( [version] [EXACT] [QUIET] [[REQUIRED|COMPONENTS] [components...]] [NO_POLICY_SCOPE])

查找并加载外来工程的设置。该命令会设置_FOUND变量,用来指示要找的包是否被找到了。如果这个包被找到了,与它相关的信息可以通过包自身记载的变量中得到。REQUIRED选项表示如果报没有找到的话,cmake的过程会终止,并输出警告信息。

  1. 在REQUIRED选项之后,或者如果没有指定REQUIRED选项但是指定了COMPONENTS选项,在它们的后面可以列出一些与包相关的部件清单(components list)。
  2. 每一个模块都会产生如下变量,_FOUND, _INCLUDE_DIR _LIBRARY和_LILBRARIES,如果_FOUND为真,_INCLUDE_DIR加入到INCLUDE_DIRECTORIES中,_LIBRARY加入到TARGET_LINK_LIBRARIES中就会有相应的变量Qt5Widgets_FOUND,Qt5Widgets_INCLUDE_DIRS等相应的变量生效。

PKG_CHECK_MODULES

PKG_CHECK_MODULES(<PREFIX> [REQUIRED] [QUIET] [NO_CMAKE_PATH] [NO_CMAKE_ENVIRONMENT_PATH] <MODULE> [<MODULE>]*)

检测所有给出的modules

PKG_CHECK_MODULES(PC_OPENNI2 libopenni2)
if (NOT PC_OPENNI2_FOUND)
PKG_CHECK_MODULES(PC_OPENNI2 REQUIRED openni2)
endif()

PC_OPENNI2_INCLUDE_DIRS, PC_OPENNI2_LIBRARY_DIRS 等被设置。

CMakeList 编写规则 -1的更多相关文章

  1. makefile的编写规则

    2.       编写makefile 示例: test:main.o func.o gcc -o test main.o func.o func.o:func.c gcc -c func.c mai ...

  2. JAVA_SE基础——编码规范&代码编写规则

    这次我来给大家说明下编码规范&代码编写规则  ↓ 编码规范可以帮助程序员在编程时注意一些细节问题,提高程序的可读性,让程序员能够尽快地理解新的代码,并帮助大家编写出规范的利于维护的Java代码 ...

  3. SQLServer存储过程编写规则

    SQLServer编写规则 1.  存储过程 a)         在程序应用中,对于数据库“写”操作的功能通过存储过程来实现. b)        存储过程命名: SP_+表名(+功能名) 对于一个 ...

  4. html-edm(邮件营销)编写规则

    最近写了一个edm邮件 以前没有接触过  使用的是很老的html页面编写规则  只能用table标签  在此记录一下edm编写的一些规则 个人参考的是这两个网址,转载一下 http://www.zco ...

  5. 这些HTML、CSS知识点,面试和平时开发都需要 No10-No11(知识点:表格操作、代码编写规则)

    系列知识点汇总 1.基础篇 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5- ...

  6. jQuery插件——1.编写规则

    jQuery插件编写规则如下: 1.命名规则:jquery.[插件名称].js 2.所有对象方法都应当附加到jQuery.fn对象上:所有的全局方法都应当附加到jQuery对象上. 3.在插件内部,t ...

  7. API接口测试用例编写规则(转载)

    API接口测试用例编写规则 (1)必需参数覆盖.对于接口的参数,接口文档一般都会说明哪些儿是必需的,哪儿是非必需的.对于必需的参数,一定要测试传参数和不传参数接口是否报错? (2)必需的参数各种情况覆 ...

  8. xpath的编写规则

    xpath的编写规则是// 表示从任意一级开始,或间隔任意级.换句话说中间就是可以隔很多层/ 从根目录开始,或从上一层的次层开始,就是需要跟上一层是上下级关系@id=aaa,id=aaa的元素,和元素 ...

  9. CMakeList.txt(2):CMakeLists.txt编写规则

    #project namePROJECT(test_math)    指定生成的工程名为test_math #head file path     INCLUDE_DIRECTORIES(includ ...

随机推荐

  1. OpenCV:初试牛刀-显示图像-1

    OpenCV开发包提供了读取各种类型的图像文件.视频内容以及摄像机输入的功能.这些功能是OpenCV开发包所包含的HighGUI工具集的一部分. 先看两个小例子: #include"open ...

  2. delphi WebBrowser的使用方法详解(三)

    WebBrowser 操作记要 WebBrowser1.GoHome;  //到浏览器默认主页 WebBrowser1.Refresh;  //刷新 WebBrowser1.GoBack;  //后退 ...

  3. Delphi Webbrowser使用方法详解(二)

    delphi如何用webbrowser模拟登录网站? 我们就以如何登录博客园来做示例: 1.要登入一个网站,首先要获取网页的源代码,我们可以通过网页菜单--查看--查看源代码来获取. 2.我们找到登录 ...

  4. spring-mvc注解配置小记

    Controller中注解Service时,Service的实现类需加@Service,dao的实现类需加@Repository. 另:配置文件中对应的包也需要扫描到!!! <context:a ...

  5. 关于Node和Deno

    Node和Deno的作者Ryan Dahl开Deno并不是“just for fun”, 也不是为了取代Node, 他有着更加远大的目标. 记住以下要点: 1. Deno目前只是一个Demo或者说是原 ...

  6. 【转】ECharts3.x中的点击事件与行为

    在ECharts中主要通过 on 方法添加事件处理函数,ECharts中的事件主要分为两种,1)鼠标事件,在鼠标click  or  hove 时触发鼠标事件: 2)另外一种是在ECharts在做图形 ...

  7. 《GPU高性能编程CUDA实战》第十章 流

    ▶ 本章介绍了页锁定内存和流的使用方法,给出了测试内存拷贝.(单 / 双)流控制下的内存拷贝的例子. ● 测试内存拷贝 #include <stdio.h> #include " ...

  8. NLP—WordNet——词与词之间的最小距离

    WordNet,是由Princeton 大学的心理学家,语言学家和计算机工程师联合设计的一种基于认知语言学的英语词典.它不是光把单词以字母顺序排列,而且按照单词的意义组成一个“单词的网络”.我们这次的 ...

  9. Gradle 语法

    参考文章: Gradle学习系列之二——创建Task的多种方法(http://www.cnblogs.com/CloudTeng/p/3417970.html) Gradle基本知识点与常用配置(ht ...

  10. UI5-文档-4.7-JSON Model

    现在我们已经设置了视图和控制器,现在是时候考虑MVC中的M了. 我们将在app中添加一个输入字段,将它的值绑定到模型上,并将相同的值绑定到输入字段的描述上.描述将根据用户类型直接更新. Preview ...