分类: C/C++
2010-03-11 10:29:57
Gcc编译:Gcc [选项]要编译的文件 [选项][目标文件]
1.预编译:gcc -E hello.c -o hello.i //-E选项只进行预处理,把相关库文件包含进来,预处理后停止编译过程.
2.编译: gcc -S hello.i -o hello.s //此阶段检查代码规范性,语法并翻译成汇编.-S选项只编译不汇编,生成汇编代码.
3.汇编: gcc -c hello.s -o hello.o //生成各功能源文件的目标文件.-c只编译不链接,生成目标文件".o"
4.链接: gcc hello.o src/hello2.o -o hello //链接各源文件生成的目标文件,生成可执行文件(可执行文件里要有main函数)
其他选项: -g 在可执行程序中包含标准调试信息
-o file 把输出文件输出到file里
-Wall 提供所有可用报警信息
ps:1.分别用-c选项在各个功能源文件夹生成各功能的目标文件
2.各个功能源文件夹里要放置用到的本地库文件,使用引号,例#include"xx.h"
(发现即使各个源文件里不包含实际使用到的本地库文件,生成目标文件,最后链接成可执行文件也是可以的.但为了可移植性,还是需要按标准做法 ,即各源文件里一定要包含实际使用到的本地库文件)
Gdb调试:1.首先在编译时,要使用-g选项把调试信息加到可执行文件中.
2.gdb调试的是可执行文件,因此首先要通过gcc编译生成可执行文件,才能进行调试.
file 装入想要调试的可执行文件.
kill 终止正在调试的程序.
list 列出产生执行文件的源代码的一部分.
next 执行一行源代码但不进入函数内部.
step 执行一行源代码而且进入函数内部.
run 执行当前被调试的程序
quit 终止 gdb
watch 使你能监视一个变量的值而不管它何时被改变.
break 在代码里设置断点, 这将使程序执行到这里时被挂起.
make 使你能不退出 gdb 就可以重新产生可执行文件.
shell 使你能不离开 gdb 就执行 UNIX shell 命令.
make管理器:能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作.用户只需编写一次简单的编译语句就可以了.
makefile格式: target:dependency_files
command
自己写makefile时候可以使用makefile变量
使用autotools生成makefile:
1.运行autoscan:在给定工程根目录或源文件子目录中检查源文件,生成"configure.scan"文件.
修改"configure.scan"文件,大致上修改以下部分即可:
AC_INIT(target.c) //源代码在当前目录 AC_INIT(src/target.c) //源代码在当前目录的src子目录
//如果有多个源文件,请以空格隔开
AM_INIT_AUTOMAKE(软件名称, 版本号) AM_INIT_AUTOMAKE(软件名称, 版本号) AC_PROG_CC AC_PROG_CC
AC_OUTPUT(makefile) //输出当前目录下的makefile AC_OUTPUT(makefile src/Makefile) //分别输出当前目录和src目录的makefile
修改后重命名"configure.scan"为"configure.ac"或者"configure.in"
2.需要为每个源码目录创建"makefile.am"文件,指定编译后的目标文件名target以及依赖的源文件source等等.编辑如下:
bin_PROGRAMS=target //输出单个目标文件 bin_PROGRAMS=target1 target2 //输出多个目标文件
target_SOURCES=source //以空格分开各源文件和库文件;target1_SOURCES=source //以空格分开target1依赖的源文件和库文件
target2_SOURCES=source //以空格分开target2依赖的源文件和库文件
工程根目录下就算没有源代码,也要创建makefile.am文件,指明源代码子目录,内容为:SUBDIRS =源代码子目录
例子:SUBDIRS=lib //当前文件夹的子文件夹里也要make,所以需要指定子文件夹
bin_PROGRAMS=hello //当前文件夹里需要生成可执行文件hello
hello_SOURCES=hello.c //可执行文件使用当前文件夹里的hello.c文件生成
hello_LDADD=lib/libhello.a //生成可执行文件还需用到静态库libhello.a
3.在工程根目录依次运行如下命令(可在工程根目录下生成脚本文件,同时执行该步骤各命令):
aclocal:生成一个"aclocal.m4"文件,该文件主要处理本地的宏定义.
autoconf:以"configure.ac"为input,生成"configure"可执行文件
autoheader:以configure.in为输入,产生名为config.h.in的文件.configure在产生makefile的同时,还以config.h.in为输入,产生config.h.这个文件实际上是将若干-DXXX编译flag以#define xxx的形式放在同一个文件中,从而避免了编译过程中出现冗长的编译标志.
automake:以"makefile.am"为输入,产生需要的makefile.in文件(可以使用选项" --add-missing"来让automake自动添加一些必需的脚本文件)
4.运行configure:以"makefile.in"为输入,产生需要的makefile
5.运行make:默认执行make all命令,生成在makefile.am中定义的目标文件.
ps:1.如果没有本地宏定义,可以略去aclocal命令
2.第1步AC_OUTPUT(XXX)中的文件名XXX与第2步:"vi XXX.AM"的文件名必须一致,可为任意名字,经过第4步后生成XXX文件(makefile),但make命令只能使用makefile,因此此时需要XXX改名成makefile后再使用make命令
3.make命令后生成可执行文件,其文件名即第2步中的target
4.我编写的执行步骤2的脚本文件autogen.sh内容如下:
#!/bin/sh
echo "Now,command "aclocal" is executed!"
aclocal
echo "Now,command "autoconf" is executed!"
autoconf
echo "Now,command "autoheader" is executed!"
autoheader
echo "Now,comnand "automake --add-missing" is executed!"
touch NEWS README AUTHORS ChangeLog
automake --add-missing
autogen.sh为权限为可执行.