Cmake的 debug和release

本文详细介绍了CMake中如何设置debug和release版本的编译选项,包括CMAKE_BUILD_TYPE变量的作用,以及如何通过CMAKE_CXX_FLAGS_DEBUG和CMAKE_CXX_FLAGS_RELEASE设置不同模式下的编译选项。同时,文章还提到了CMake在Android平台上的应用,以及如何使用CMake进行交叉编译,并给出了Android NDK和toolchain-file的使用示例。
摘要由CSDN通过智能技术生成

Cmake的 debug版本和release版本(转)

 
debug版本的项目生成的可执行文件需要有调试信息并且不需要进行优化,而release版本的不需要调试信息但是需要优化。这些特性在gcc/g++中通过编译时的参数来决定的,如果将优化程度调到最高需要设置 -O3 ,最低的是 -O0 即不做优化,添加调试信息的参数是 -g  -ggdb,如果不添加这个参数,调试信息就不会被包含在生成的二进制中
 

CMake中有一个变量CMAKE_BUILD_TYPE,可以取值枚举入下:Debug   Release  RelWithDebInfo  和  MinSizeRel


当这个变量值为Debug的时候,Cmake会使用变量CMAKE_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG中的字符串作为编译选项生成Makefile,
 

当这个变量值为Release的时候,工程会使用变量CMAKE_CXX_FLAGS_RELEASE和CMAKE_CFLAGS_RELEASE选项生成Makefile。

 

现在假设项目中只有一个文件main.cpp,下面是一个可以选择生成debug版和release版的程序的CMakeList.txt:
1 PROJECT(main)

2 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)

3 SET(CMAKE_SOURCE_DIR .)

45 SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")

6 SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

78 AUX_SOURCE_DIRECTORY(. DIR_SRCS)

9 ADD_EXECUTABLE(main ${DIR_SRCS})

第 5 和 6 行设置了两个变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_CXX_FLAGS_RELEASE, 这两个变量是分别用于 debug 和 release 的编译选项。 编辑 CMakeList.txt 后需要执行 ccmake 命令生成 Makefile 。在进入项目的根目录,输入 "ccmake ." 进入一个图形化界面,如下图所示:
 ccmake的界面

 

执行了configure后的ccmake的界面

 

 

下面我们首先生成debug版的Makefile:将变量CMAKE_BUILD_TYPE设置为Debug,按“c”进行configure,按“g”生成Makefile并推出。这时执行命令 find * | xargs grep  “O0”后结果如下:

 

执行命令 find * | xargs grep  “O0”后的结果

 

CMakeFiles/main.dir/flags.make:CXX_FLAGS = -O0 -Wall -g -ggdb CMakeFiles/main.dir/link.txt:/usr/bin/c++ 
-O0 -Wall -g -ggdb CMakeFiles/main.dir/main.cpp.o -o main -rdynamic 

CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")

这个结果说明生成的 Makefile 中使用了变量 CMAKE_CXX_FLAGS_DEBUG 作为编译时的参数。
 

下面我们将生成Release版本的Makefile:再次执行“ccmake ." ,将变量CMAKE_BUILD_TYPE设置为Release,生成Makefile并推出。执行命令 find * | xargs grep  “O0”后结果如下:

find * | xargs grep "O0"的执行结果

CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")而执行命令 find * | xargs grep "O3" 后结果如下:

CMakeCache.txt:CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUGCMakeCache.txt:CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUGCMakeFiles/main.dir/flags.make:CXX_FLAGS = -O3 -Wall CMakeFiles/main.dir/link.txt:/usr/bin/c++ -O3 -Wall CMakeFiles/main.dir/main.cpp.o -o main -rdynamic CMakeLists.txt:SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

这两个结果说明生成的Makefile中使用了CMAKE_CXXFLAGS_RELEASE,作为编译时的参数


####################################################################################

 
 在cmake中要编译debug模式的话,在CMakeLists.txt中添加如下两行

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb ")

SET(CMAKE_CXX_FLAGS_RELEASE "${ENV{CXXFLAGS} -O3 -Wall")

 

然后,在编译的时候,使用如下命令:

cmake -DCMAKE_BUILD_TYPE=Debug/Release  path

 

第三个参数path是指项目的顶层路径

1.  cmake支持gdb的实现,

首先在CMakeLists.txt下加入

SET(CMAKE_BUILD_TYPE "Debug")

在下面加入:

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")

SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

原因是CMake 中有一个变量 CMAKE_BUILD_TYPE ,可以的取值是 Debug Release RelWithDebInfo >和 MinSizeRel。

当这个变量值为 Debug 的时候,CMake 会使用变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串作为编译选项生成 Makefile;

 

 

2.  在GDB中间加入程序启动参数

比如我们需要调试一个可执行文件./a.out help

这时

$gdb ./a.out

进入到gdb的命令行模式下,然后:

(gdb) set args help

就能加上可执行文件需要的参数,如果要看argc[1]到argc[N]的参数,只需要

(gdb) show args

 

3. gdb中查看字符串,地址的操作,数据类型

比始有一个int型的变量i,相要知道他的相关信息,可以

(gdb) print i

打印出变量i的当前值

(gdb)x &i

与上面的命令等价。

如果有x命令看时,需要看一片内存区域,(如果某个地方的值为0,用x时会自动截断了)

(gdb) x/16bx address

单字节16进制打印address地址处的长度为16的空间的内存,16表示空间长度,不是16进制,x表示16进制,b表示byte单字节

gdb看变量是哪个数据类型

(gdb) whatis i 

即可知道i是什么类型的变量



 ####################################################################################
 

官方文档https://cmake.org/cmake/help/v3.7/

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程),输出各种各样的makefile或者project文件。CMake”这个名字是“cross platform make”的缩写。

 

  1. $> cmake ../sdk -Ddebug=ON

  2. $> make

  3. $> make install

第一条命令用于根据路径../sdk下的CMakeLists.txt生成Makefile文件;第二条命令执行Makefile文件,编译程序,生成可执行文件;第三条命令安装生成的可执行文件。

#后面为注释的内容。

CMakeLists.txt中的命令可以全部大写,或者全部小写。
 

# 指定工程名 e.g. 指定本工程的工程名为test_math

project(test_math)

 

# 定义变量 e.g. 定义SLNDIR变量,变量值为../../。变量的使用方法为${variable name}

set(SLNDIR ../../)

# 从文件加载CMake命令 e.g. 加载../../prj.mak/sp.cmake文件的所有命令

include(${SLNDIR}prj.mak/sp.cmake)

# 添加包含路径,编译器能这些路径中寻找头文件 e.g. 添加两个路径

include_directories (${SLNDIR}src/include ${SLNDIR}src/3rd/include )

# 添加可执行文件。从源文件source1, source2...生成可执行文件name

 

add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
# 添加库。从源文件source1, source2...生成库name(静态库,动态库)

 

 

add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
# 显示信息

 

 

message([<mode>] "message to display" ...)

# 添加build子文件夹。告诉CMake执行source_dir下的 CMakeLists.txt文件,编译source_dir中的源代码

 

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
#  收集所有的源文件。将dir路径下的所有源文件都存储在variable中

 

 

aux_source_directory(<dir> <variable>)

 

# 设置链接库的搜索路径。相当于gcc中的-L(大写L)

 

Specify directories in which the linker will look for libraries.

link_directories(directory1 directory2 ...)

# 设置链接库。该命令之后的所有target都要链接该命令中设置的库

 

Link libraries to all targets added later.

link_libraries([item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)

# 设置预编译宏。e.g. Debug模式下add_definitions(-g -D_DEBUG); Release模式下add_definitions(-DNDEBUG -O2)

add_definitions(-DFOO -DBAR ...)

# 用户可选择的选项。
option(debug "is debug mode?" OFF).可以通过-D选择不同的选项。
如cmake ../source -Ddebug=ON;cmake ../source -Ddebug=OFF

 

option(<option_variable> "help string describing option" [initial value])
option_variable可以通过${option_variable}进行访问,其值为ON或者OFF

# 设置变量,取消变量

set (CMAKE_DEBUG_POSTFIX "d") 
#设置debug模式时,输出产物名加后缀d

unset (CMAKE_DEBUG_POSTFIX)
# 取消CMAKE_DEBUG_POSTFIX变量的设置

# 逻辑判断

if(<variable>)

if(NOT <expression>)

if(<expr1> AND <expr2>)

if(<expr1> OR <expr2>)

if(DEFINED <variable>)

if((expression) AND (expression OR (expression)))

 

if(<variable|string> MATCHES regex)if(<variable|string> LESS <variable|string>)if(<variable|string> GREATER <variable|string>)if(<variable|string> EQUAL <variable|string>)if(<variable|string> STRLESS <variable|string>)if(<variable|string> STRGREATER <variable|string>)if(<variable|string> STREQUAL <variable|string>)

 

 

 

cmake操作系统平台的判断

 

  1. MESSAGE(STATUS "operation system is ${CMAKE_SYSTEM}") 

 

  1. IF (CMAKE_SYSTEM_NAME MATCHES "Linux")  
  2.     MESSAGE(STATUS "current platform: Linux ")  
  3. ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")  
  4.     MESSAGE(STATUS "current platform: Windows")  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值