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。