内容来自《Linux 程序设计权威指南》
gcc的基本用法:gcc -o prog main.c subr1.c subr2.c subr3.c
其中:-o prog指定输出可执行文件名为prog.
其它选项:
-c 只预处理、编译和汇编源程序,不进行连接。
-Idir 将dir目录添加到搜寻头文件的目录列表中去,并优于gcc的搜索目录。
-O 对程序编译进行优化。
-O2 允许比-O更好的优化。
-g 产生一张用于调试和排错的扩展符号表。
添加宏定义:gcc -DHAVE_GDBM -DHELP_FILE=\"help\" cdict.c
其中第一个-D选项定义宏HAVE_GDBM,在程序里可以用#ifdef去检查它是否被设置。第二个-D选项将宏HELP_FILE定义为字符串“help”,这对于控制程序打开哪个文件是很有用的。
gcc的常用连接选项:
gcc -O prog mian.o subr.o -L../lib -lany -lm
添加../lib目录作为搜索any和m文件的优先搜索目录。
-static 禁止预共享函数库连接。
-shared 尽量与共享函数库连接,这是缺省选项。
函数库分为静态、共享和动态。静态在编译时载入(.a),共享在程序运行时载入(.so),动态在调用时才载入。
一个标准库的名称如下:libname.so.major.minor libname.a
系统中可用的库都存放在/usr/lib和/lib目录中。有一些库可能存放在特定的目录中,在/etc/ld.so.conf配置文件中给出了这些目录的列表。
对共享库进行更新或安装新库后,必须运行ldconfig命令更新/etc/lld.so.conf中相应的项。
连接标准算术库: gcc test.c -o test -lm
引用其它目录中的库:gcc test.c test -Lmydir -lmylib
创建自己的函数库:ar rs lib-name list-of-files
r选项表示ar命令应把列表list-of-files中的目标文件增加到lib-name库中,如果lib-name库不存在,就创建一个。s表示产生一个该库的索引。
更新一个库:ar rus lib-name list-of-files
从函数库删除一个或多个文件:ar ds lib-name list-of-files
从函数库提取一个或多个文件:ar x lib-name list-of-files
编写Makefile
make用于自动确定一个软件包的哪些部分需要重新编译,并用特定的命令去编译它们。
要使用make,必须编写一个叫Makefile的文件,它描述了软件包各个文件之间的关系,提供了更新每个文件的命令。
只要有一个合适的Makefile存在,每次改变某些源文件后,只需要make就完成所有必须的重新编译。
# 一个简单的Makefile的例子
prog: prog.o subr.o
gcc -o prog
prog.o subr.o
prog.o: prog.c prog.h
gcc -c -I.
-o prog.o prog.c
subr.o: subr.c
gcc -c
-o subr.o subr.c
clean:
rm -f prog
*.o
每一个冒号开头的都是目标(target),后面是相关文件,下面是实现这个目标的一组shell命令。
一般情况下输入:make target 生成该目标,如果省略target,则生成第一个目标。
若输入make clean,则执行rm -f prog *.o,即删除所有的目标模块
如果没有给出某一目标的相关目标构造命令,则利用隐含规则,即make程序自动寻找相关文件自动生成。上面的Makefile可以简化为:
# 一个简单的Makefile的例子
prog: prog.o subr.o
gcc -o prog
prog.o subr.o
clean:
rm -f prog
*.o
利用automake和autoconf产生Makefile
建立一个test.c程序,接下来用Autoconf及Automake来产生Makefile文件。
1)> autoscan #用autoscan产生一个configure.in的模板
2)编辑configure.scan
AC_PREREQ(2.57)
AC_INIT(test.c)
AM_INIT_AUTOMAKE(test,1.0)
#AC_CONFIG_SRCDIR([test.c])
#AM_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler
characteristics.
# Checks for library functions.
AC_OUTPUT(Makefile)
3) >aclocal
>autoconf
4)编辑Makefile.am文件:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=test
test_SOURCES=test.c
5)automake --add-missing
6) ./configure
7)make
8)./test 运行程序
利用这个Makefile文件,可以运行下面这些命令:
>make all 产生我们设定的目标,只输入make也可以。
>make clean 清除之前所编译的可执行程序及目标文件。
>make install 将程序安装到系统目录中。这个例子安装到/usr/local/bin下
>make dist 将程序和相关的文件包装成一个压缩文件以供发布,产生PACKAGE-VERSION.tar.gz文件。
>make distchk 在上一个命令的基础上还进行检查。
Debug工具GDB
编译时产生调试信息:gcc -ggdb -o test test.c
>gdb test 启动gdb
(gdb) file test
(gdb)run 运行程序
(gdb)list 显示源代码
(gdb)break 27 在27行设置断点
(gdb)watch i 观察变量i
(gdb)next 下一步
(gdb)quit
其他调试工具:
DDD
kdbg
tgbd