C++编程(五)---Cmake详解Makefile详解
C/C++程序员肯定离不开Makefile和Cmake,因为如果对这两个⼯具不熟悉,那么你就不是⼀个合格的C/C++程序员。本⽂对Makefile和Cmake,及它们的使⽤进⾏了详细的介绍,本⽂的⽬录如下:
⼀、Makefile详解
1.1 Makefile语法
1.2 Makefile⽰例
⼆、Cmake详解
2.1 Cmake语法
2.2 Cmake⽰例
⼀、Makefile详解
Makefile描述了整个⼯程的编译、连接等规则,makefile定义了⼀些列规则来指定,哪些⽂件需要编译以及如何编译、需要创建哪些库⽂件以及如何创建这些库⽂件、如何产⽣我们想要的可执⾏⽂件。使⽤Ma
kefile,整个⼯程都可以完全⾃动化编译。⽽且Makefile 可以有效的减少编译和连接的程序,只编译和连接那些修改的⽂件。
1.1  Makefile语法
1.1.1
Makefile包含了五个重要的东西:显⽰规则、隐晦规则、变量定义、⽂件指⽰和注释。
1. 显⽰规则:显⽰规则说明了,如何⽣成⼀个或多个⽬标。这是由Makefile指出要⽣成的⽂件和⽂件依赖的⽂件。
2. 隐晦规则:基于Makefile的⾃动推导功能makefile phony
3. 变量的定义:⼀般是字符串
4. ⽂件指⽰:⼀般是在Makefile中引⽤另外⼀个makefile⽂件;根据某些规则指定Makefile中有效的部分;多⾏
5. 注释:#指⽰注释
Makefile有三个⾮常重要的变量:$@、$^、$#,它们的含义如下:
$@    ---⽬标⽂件
$^      ---所有依赖⽂件
$<      ---第⼀个依赖⽂件
.PHONY  ---伪⽬标⽂件
Makefile的执⾏过程如下:
1. 在当前⽬录下寻Makefile或makefile。
2. 到第⼀个⽂件中的第⼀个⽬标⽂件,和⽬标⽂件依赖的.o⽂件。
3. 如果.o⽂件不存在,或是后⾯.o⽂件⽐target⽂件更新,那么它就会执⾏后⾯的语句来⽣成这个⽂件。
4. 最后makefile会根据.o⽂件依赖的.h和.c⽂件⽣成.o⽂件。
1.1.2
注意:
1. clean不要放在target前⾯。
2. -rm edit  $(objects)  忽略某些⽂件的问题。
3. Makefile中的命令,必须以[Tab]键分割。⽂件之间最好使⽤空格分割。
4. -I 或 --include-dir 参数,那么make就会在这些⽬录下去寻。
5. -L 相当于load lib dir, -lfb303  相当于libfb303.so
1.1.3 g++编译命令:
1. -g  相当于debug
2. -Wall 相当于忽略warnning
3. -O1~3 相当于优化级别
4. -lpthread多线程
5. -j8 多线程编译
6. -D相当于宏定义,-D_YUQIANG,那么#ifdef _YUQIANG就是True的。
1.2  Makefile⽰例
CC = gcc
RM = rm
CFLAGS += -D _YUQIANG
TARGETS := myapp
all:$(TARGETS)
$(TARGETS):main.c
$(CC) $(CFLAGS) $^ -o $@
clean:
-
$(RM) -f *.o
-$(RM) -f $(TARGETS)
⼆、CMake详解
CMake是⼀个夸平台的安装(编译)⼯具,可以简单的语句描述所有平台的安装(编译过程)。它能输出各种各样的makefile或者project⽂件,能测试编译器所⽀持的c++特性,类似UNIX下的automake。
2.1 Cmake语法
1.  project name
PROJECT( project name )
2. 头⽂件路径
INCLUDE_DIRECTORIES( include )
3. 设置环境变量的值
SET( TEST_DIR ${DIR_SRCS})
4. 设置外部库
SET(LIBRARIES libm.so)
5. 设置可执⾏⽂件路径
ADD_EXECUTABLE( ../bin/bin ${TEST_DIR})
6. 设置链接库
TARGET_LINK_LIBRARIES(../bin/bin ${LIBRARIES})
7. 设置代码⼦⽬录
ADD_SUBDIRECTORY
2.2 CMake⽰例
#project name
PROJECT(test_math)
#head file path
INCLUDE_DIRECTORIES(
include
)
#source directory
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
#set environment variable
SET(TEST_MATH
${DIR_SRCS}
)
#set extern libraries
SET(LIBRARIES
libm.so
)
#add executable file
ADD_EXECUTABLE(../bin/bin ${TEST_MATH})
#add link library
TARGET_LINK_LIBRARIES(../bin/bin ${LIBRARIES}

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