Cmake的debug和release
Cmake的 debug版本和release版本(转)
debug版本的项⽬⽣成的可执⾏⽂件需要有调试信息并且不需要进⾏优化,⽽release版本的不需要调试信息但是需要优化。这些特性在gcc/g++中通过编译时的参数来决定的,如果将优化程度调到最⾼需要设置 -O3 ,最低的是 -O0 即不做优化,添加调试信息的参数是 -g  -ggdb,如果不添加这个参数,调试信息就不会被包含在⽣成的⼆进制中
cmake如何使用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版的程序的:
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 的编译选项。 编辑 后需要执⾏ 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.:/usr/bin/c++
-O0 -Wall -g -ggdb CMakeFiles/main.dir/main.cpp.o -o main -rdynamic
<: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"的执⾏结果
<:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")⽽执⾏命令 find * | xargs grep "O3"后结果如下:
<:CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -
<:CMAKE_C_FLAGS_RELEASE:STRING=-O3 -
DNDEBUGCMakeFiles/main.dir/flags.make:CXX_FLAGS = -O3 -Wall CMakeFiles/main.:/usr/bin/c++ -O3 -Wall CMakeFiles/main.dir/main.cpp.o -o main -:SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
这两个结果说明⽣成的Makefile中使⽤了CMAKE_CXXFLAGS_RELEASE,作为编译时的参数
>>>>>>>>>>>>>>>>####
在cmake中要编译debug模式的话,在中添加如下两⾏
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的实现,
⾸先在下加⼊
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是什么类型的变量
>>>>>>>>>>>>>>>>####
CMake是⼀个跨平台的安装(编译)⼯具,可以⽤简单的语句来描述所有平台的安装(编译过程),输出各种各样的makefile或者project⽂件。CMake”这个名字是“cross platform make”的缩写。
1. $> cmake ../sdk -Ddebug=ON
2. $> make
3. $> make install
第⼀条命令⽤于根据路径../sdk下的⽣成Makefile⽂件;第⼆条命令执⾏Makefile⽂件,编译程序,⽣成可执⾏⽂件;第三条命令安装⽣成的可执⾏⽂件。
#后⾯为注释的内容。
<中的命令可以全部⼤写,或者全部⼩写。
# 指定⼯程名 e.g. 指定本⼯程的⼯程名为test_math
project(test_math)
# 定义变量 e.g. 定义SLNDIR变量,变量值为../../。变量的使⽤⽅法为${variable name}
set(SLNDIR ../../)
# 从⽂件加载CMake命令 e.g. 加载../../prj.ake⽂件的所有命令
include(${SLNDIR}prj.ake)
# 添加包含路径,编译器能这些路径中寻头⽂件 e.g. 添加两个路径
include_directories (${SLNDIR}src/include ${SLNDIR}src/3rd/include )
# 添加可执⾏⽂件。从源⽂件source1, ⽣成可执⾏⽂件name
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...]) # 添加库。从源⽂件source1, ⽣成库name(静态库,动态库)
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
# 显⽰信息
message([<mode>] "message to display" ...)
# 添加build⼦⽂件夹。告诉CMake执⾏source_dir下的 ⽂件,编译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
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")

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论