gcc使用整理(2)

来源:互联网 发布:java程序员培训价格 编辑:程序博客网 时间:2024/05/18 07:15
 

GCC和G++的区别

    误区一:gcc只能编译c代码,g++只能编译c++代码。

    两者都可以。但是请注意:

1. 后缀为.c的,gcc把它当作C语言,而g++当作是C++程序。后缀为.cpp的一样当成C++。

2. 编译阶段,g++会调用gcc,对于c++代码,两者是等价的。但是因为gcc命令不能自动和C++程序使用的库链接,所以通常用g++完成链接。为了统一,干脆用g++。

    误区四:extern "C"与gcc、g++有关系

    实际上并无关系,都是以C的命名方式来为symbol命名。

 

编译简单的C程序

    假定代码存为“hello.c”,要用gcc编译该文件,使用下面的命令:

gcc -g -Wall hello.c -o hello

该命令将文件hello.c中的代码编译为机器码并存储在可执行文件hello中。机器码的文件名是通过-o选项指定的。选项-Wall开启编译器几乎所有常用的警告。选项-g表示在生成的目标文件中带调试信息。

 

编译多个源文件

例子将程序helloworld分割成三个文件hello.c、hello_fn.c、hello.h。要用gcc编译以上源文件,使用下面的命令:

gcc -Wall hello.c hello_fn.c -o newhello

注意到头文件hello.h并未在命令行中指定,源文件中的#include "hello.h"使得编译器自动将其包含到合适的位置。

 

简单的makefile文件

make从makefile中读取项目的描述,指定了一系列目标和依赖的编译规则。下面是上一节项目的简单的makefile:

CC=gcc

CFLAGS=-Wall

hello: hello.o hello_fn.o

clean:

    rm -f hello hello.o hello_fn.o

 

链接外部库

    库是预编译的目标文件的集合,它们可以被链接进程序。静态库以后缀.a的存档文件。标准系统库可在目录/usr/lib与/lib中找到。

    比如,在类Unix系统中,C语言的数学库一般存储为文件/usr/lib/libm.a。该库中函数的原型声明在头文件/usr/include/math.h中。

    在一个调用数学库libm.a中sin函数的例子,尝试单独从该文件生成一个可执行文件将导致一个链接阶段的错误。函数sin未在本程序中定义也不在默认库libc.a中。为使编译器能将sin链接进主程序,我们需要提供数学库libm.a,一个容易想到但比较麻烦的做法是在命令行中显式地指定它 gcc -Wall calc.c /usr/lib/libm.a -o calc。为了避免在命令行中指定长长的路径,编译器为链接函数库提供了快捷的选项-l。例如 gcc -Wall calc.c -lm -o calc。与我们上面指定库全路径的命令等价。一般,-lNAME使链接器尝试链接系统库目录中的函数库文件libNAME.a。

原创粉丝点击