null第一章 LINUX下编译与调试第一章 LINUX下编译与调试学习目标学习目标gcc/g++编译命令gcc/g++编译命令对于.c格式的C文件,可以采用gcc或g++编译
对于 .cc、.cpp格式的C++文件,应该采用g++进行编译
常用的选项两种
-c
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示编译源文件
-o 表示输出目标文件
-g 在目标文件中产生调试信息,用于gdb调试
-D <宏定义> 编译时将宏定义传入进去
-Wall 选项可以打开所有类型的语法警告,以便帮助我们确定代码是正确的,并且尽可能实现可移植性。编译和连接的方式 编译和连接的方式 1、g++ -c func.cpp
将编译func.cpp,并且生成同名的但扩展名为.o的二进制目标文件 func.o
同样道理
g++ -c main.cpp
将编译main.cpp,并且生成同名的但扩展名为.o的二进制目标文件 main.o
2、g++ -c func.cpp -o func.o
功能同(1)一样,但是显式地指定了输出文件名为main.o
同样道理
g++ -c main.cpp –o main.o
编译main.cpp,并输出目标文件main.o
3、(1)、(2)的基础上
g++ main.o func.o
g++ -o a.out main.o func.o
g++ -o a.out *.o
都将连接目标文件main.o和func.o最后形成可执行文件a.out
对于第一种,如果没有显式指定可执行文件名,g++默认为a.out编译和连接的方式编译和连接的方式也可以将编译和链接的过程合为一块处理:
g++ *.cpp
g++ func.cpp main.cpp
g++ -o a.out func.cpp main.cpp
都将先编译指定的源文件,如果成功的话,再链接成可执行文件a.out
采用第4种方式,在其中第某个源文件中必须有main
函数
excel方差函数excelsd函数已知函数 2 f x m x mx m 2 1 4 2拉格朗日函数pdf函数公式下载
,否则链接通不过。
如果希望在编译时传入宏定义,可使用-D
参数
转速和进给参数表a氧化沟运行参数高温蒸汽处理医疗废物pid参数自整定算法口腔医院集中消毒供应
,例如
g++ -D _DEBUG *.cpp什么是makefile什么是makefilemakefile的工作过程为:先将需要编译连接的c/c++源文件组织到文件makefile中,接着运行make程序,make程序读取当前文件夹下面的makefile文件信息,并根据makefile里面的组织信息,调用相应的gcc/g++/shell等程序,完成对源文件的批量编译和连接。要写makefile文件,首页必须清楚目标文件和依赖文件的概念。通常情况下,目标文件和依赖文件都是指实际的文件。
例如,有makefile文件,
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
如下:
main.exe:main.o func.o
g++ -o main.exe main.o func.o
main.o:main.cpp
g++ -c main.cpp
func.o:func.cpp
g++ -c func.cppMakefile文件的依赖关系Makefile文件的依赖关系文件第一行中的文件main.exe称为目标文件,冒号后面以空格分隔的两个文件称为main.exe的依赖文件。意思是文件main.exe的产生依赖于文件main.o和func.o
同样道理:
第3行的main.o为目标文件,main.cpp为main.o的依赖文件。
第5行的func.o为目标文件,func.cpp为func.o的依赖文件.
第2行(以tab开头)表示要产生第1行的目标文件需要执行的命令。make程序的处理过程make程序的处理过程make程序首先读到第1行的目标文件main.exe和它的两个依赖文件main.o和func.o;然后比较文件main.exe和main.o/func.o的产生时间,如果main.exe比main.o/func.o旧的话,则执行第2条命令,以产生目标文件main.exe。
在执行第2行的命令前,它首先会查看makefile中的其他定义,看有没有以第1行main.o和func.o为目标文件的依赖文件,如果有的话,继续按照(1)、(2)的方式匹配下去。
根据(2)的匹配过程,make程序发现第3行有目标文件main.o依赖于main.cpp,则比较目main.o与它的依赖文件main.cpp的文件新旧,如果main.o比main.cpp旧,则执行第4行的命令以产生目标文件main.o.在执行第4条命令时,main.cpp在文件makefile不再有依赖文件第定义,make程序不再继续往下匹配,而是执行第4条命令,产生目标文件main.o目标文件func.o按照上面的同样方式判断产生.
执行(3)、(4)产生完main.o和func.o以后,则第2行的命令可以顺利地执行了,最终产生了第1行的目标文件main.exe。特殊处理与伪目标特殊处理与伪目标先看一些makefile的特殊情况:
makefile文件内容为
a:
@echo 'a‘
执行make时,如果文件a存在,echo ‘a’将不会被调用,可以理解为文件a没有依赖文件,则认为文件a总是最新的,不需要执行;如果文件a不存在,echo ‘a’将会被调用。
a:b
@echo 'a‘
如果文件b不存在,不管a是否存在,make时都将会报错
如果文件b存在,文件a不存在,则echo ‘a’会被调用
如果文件a、b都存在,则按照正常的方式先比较文件新旧,决定是否调用echo特殊处理的例子特殊处理的例子执行make clean将清除掉文件夹中的二进制可执行文件
执行make rebuild则先执行清除,再重新编译连接。
main.exe:main.o func.o
g++ -o main.exe main.o func.o
main.o:main.cpp
g++ -c main.cpp
func.o:func.cpp
g++ -c func.cpp
.PHONY:rebuild clean
rebuild:clean main.exe
clean:
rm *.o *.exeMakefile变量Makefile变量随着软件项目的变大、变复杂,源文件也越来越多,如果采用前面的方式写makefile文件,将会使makefile也变得复杂而难于维护。通过make支持的变量定义、使用、内置函数和规则,可以写出通用性较强的makefile文件,使得同一个makefile文件能够适应不能的项目。
变量:为一文本串定义一个名字,名字即为变量的名称,文本串即为变量的值。
定义变量的一般方法:
变量名=变量值 递规变量展开(几个变量共享一个值)
或者
变量名:=变量值 简单变量展开(类似于C++的赋值)
使用变量的一般方法:
$(变量名)=??? 赋值
???=$(变量名) 引用使用makefile变量使用makefile变量OBJS= main.o func.o
main.exe:$(OBJS)
g++ -o main.exe main.o func.o
main.o:main.cpp
g++ -c main.cpp
func.o:func.cpp
g++ -c func.cpp
自动变量自动变量make内部事先定义好了一些变量,他们分为两种类型,自动变量和预定义变量:
自动变量: 指在使用的时候,自动用特定的值替换。
常用的有:预定义变量预定义变量预定义变量:也是make内部事先定义好的变量,但是它的值是固定的,并且有些的值是为空的。
常用的有:内部变量举例内部变量举例OBJS :=main.o func.o
CC :=g++
main.exe:$(OBJS)
$(CC) -o $@ $^
main.o:main.cpp
$(CC) -o $@ -c $^
func.o:func.cpp
$(CC) -o $@ -c $^makefile模式规则makefile模式规则模式规则是指通用第匹配方式,模式规则必须指定”%”,百分号可以匹配任何字符串,例如下面规则:
%.o: %.cpp
表示任何目标文件的依赖文件是与目标文件同名的并且扩展名为.cpp的文件
根据模式规则,上面的makefile可改写为:OBJS :=main.o func.o
CC :=g++
main.exe:$(OBJS)
$(CC) -o $@ $^
%.o: %.cpp
$(CC) -o $@ -c $^makefile函数makefile函数makefile 里的函数跟它的变量很相似——使用的时候,你用一个 $ 符号跟开括号,函数名,空格后跟一列由逗号分隔的参数(第一个参数前不要逗号),最后用关括号结束。例如,有一个叫wildcard 的函 数,它有一个参数,功能是搜索当前目录下的文件名,展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。你可以像下面所示使用这个命令:SOURCES = $(wildcard *.cpp) 这行会产生一个所有以 '.cpp'的文件的列表,然后存入变量 SOURCES 里。当然你不需要一定要把结果存入一个变量。 另一个有用的函数是字符串替换函数:
$(patsubst,要查找的子串,替换后的目标子串,源字符串)
它用于将源字符串(以空格分隔)中的所有要查找的子串替换成目标子串。
例如,处理那个经过上面定义后的变量,
OBJS = $(patsubst %.cpp,%.o,$(SOURCES))
将处理所有在SOURCES 字列中的字(一列文件名),如果它的结尾是 '.cpp' ,就用'.o' 把 '.cpp' 替换。
注意这里的 % 符号将匹配一个或多个字符。 gdb调试器gdb调试器Linux 包含了一个叫gdb的调试程序。gdb可以用来调试C和C++ 程序。
gdb 提供如下一些常用功能:
它使你能监视你程序中变量的值.
它使你能设置断点以使程序在指定的代码行上停止执行.
它使你能一行行的执行你的代码.
为了使gdb正常工作, 你必须使你的程序在编译时包含调试信息. 调试信息包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。 gdb 利用这些信息使源代码和机器码相关联。 在程序编译时用 -g 选项可打开调试选项.
gdb 基本命令 gdb 支持很多的命令使你能实现不同的功能. 这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令, 表1列出了你在用 gdb 调试时会用到的一些命令. gdb 基本命令gdb 基本命令gdb 基本命令gdb 基本命令Gdb调试过程Gdb调试过程Gdb调试过程Gdb调试过程Gdb调试过程Gdb调试过程练习练习编写2个以上的类的工程,分别通过gcc命令和makefile编译成执行文件。