Linux的gcc,makefile和autotools

来源:互联网 发布:淘宝差评什么时候消失 编辑:程序博客网 时间:2024/05/17 09:05
 

gcc主要参数:

-g

只是编译器,在编译的时候,产生调试信息。

-c

只激活预处理,编译,和汇编,也就是他只把程序做成obj文件。

例子用法:

gcc -c hello.c

他将生成.o的obj文件。

-S

只激活预处理和编译,就是指把文件编译成为汇编代码。

例子用法

gcc -S hello.c

他将生成.s的汇编代码。

-E

只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.

例子用法:

gcc -E hello.c > pianoapan.txt 或

gcc -E hello.c –o hello.i

-o

指定目标输出文件名称。

例子用法

gcc -o hello.exe hello.c

-l和-L

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库 文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了,好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上 libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。放在/lib和/usr/lib和 /usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr /X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L /aaa/bbb/ccc -ltest。

-include和-I(i的大写)

-include用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现,-include参数很少用。-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但 是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I /myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。

-O0

-O1

-O2

-O3

编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高。

举例有文件operator.h, operator.c和main.c

其中文件operator.h中引用了math.h头文件,main.c是主程序。

编写makefile文件:

main:main.o operator.o

gcc –g –lm main.o operator.o –o main

main.o:main.c

gcc main.c –o main.o

operator.o:operator.c operator.h

gcc operator.c –o operator.o

使用autotools自动生成makefile

1、# autoscan

生成了configure.scan文件。

2、修改configure.scan的文件名为configure.in,并修改configure.in文件:修改AC_INIT里面的参数;添加宏AM_INIT_AUTOMAKE;AC_OUTPUT后添加输出文件Makefile。

3、# aclocal

生成了aclocal.m4文件。

4、# autoconf

生成了configure文件。

5、autoheader

生成了config.h.in文件。

6、建立并编写Makefile.am文件。

7、# automake --add-missing

8、# ./configure

9、# make

修改后的configure.in文件: (红色为添加,蓝色为修改)

#

AC_PEERED(2.57)

AC_INIT(main, 1.0)

#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

AC_CONFIG_SRCDIR([operator.h])

AM_CONFIG_HEADER([config.h])

AM_INIT_AUTOMAKE(main, 1.0)

#

AC_PROG_CC

#Checks for libraries

AC_CHECK-LIB([m], [sqrt])

#

#

#

AC_CHECK_FUNC([sqrt])

AC_OUTPUT([Makefile])

编写的makefile.am文件:

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=main

main_SOURCES=main.c operator.c operator.h

LIBS=-lm