后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;
后缀为.cpp的,两者都会认为是c++程序。
注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。
编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接。
为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的(当然最好就用g++)。
编译程序命令
- 我们用gcc编译程序时,常常会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:例:
#gcc -o hello hello1.c hello2.c hello3.c -I/home/hello/include -L/home/hello/lib -lworld
- 这条命令运行后,会在当前文件夹下产生一个hello文件,这个文件就是可执行文件(类似windows的hello.exe),在当前文件执行命令./hello,即可运行该文件,也就是运行后面三个C源文件。-o即out指定输出文件名。
- 上面这句表示在编译hello.c时:(如果有多个.c源文件联合编译,连着写就行。)
-
-I/home/hello/include
,表示将/home/hello/include目录作为第一个寻找源代码中引入的头文件的目录,寻找的顺序是:/home/hello/include–>/usr/include–>/usr/local/include,也就是指定优先查找的目录,找不到的话查找默认目录。如果没有-I相关的指定,那么就是省略头文件位置默认为当前文件夹。 -
-L/home/hello/lib
,表示将/home/hello/lib目录作为第一个寻找库文件的目录, 寻找的顺序是:/home/hello/lib–>/lib–>/usr/lib–>/usr/local/lib,同上,也是指定优先查找的目录,如果省略就是指当前文件夹优先。 -
-lword
, 表示寻找具体的动态链接库文件libword.so(也就是文件名去掉前缀和后缀所代表的库文件),如果加上编译选项-static,表示寻找静态链接库文件,也就是libword.a。
当然也可以直接把连接库文件的全路径放过来,比如用/home/hello/lib/libword.a来代替-L/home/hello/lib -lworld。
静态库和动态库的使用区别
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。
然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
对于第三方提供的动态链接库(.so),一般将其拷贝到一个lib目录下(/usr/local/lib),或者使用-L来指定其所在目录, 然后使用-l来指定其具体名称。
一个例子
现在假设有一个叫hello的程序开发包,它提供一个静态库libhello.a 一个动态库libhello.so,一个头文件hello.h,头文件中提供sayhello()这个函数 void sayhello(); 另外还有一些说明文档。
这一个典型的程序开发包结构 与动态库连接, linux默认的就是与动态库连接,下面这段程序testlib.c使用hello库中的sayhello()函数
int main()
{
sayhello();
return 0;
}
使用如下命令进行编译
#gcc -c testlib.c
,在当前文件夹得到链接文件testlib.o,无论静态库.a,还是动态库.so,都是由.o文件创建的。再用如下命令连接:
#gcc -o test testlib.o -lhello
,在当前文件夹得到可执行文件test。上面两步可以一步到位:
#gcc -o test testlib.c -lhello
(libhello.so动态库文件放在当前目录)
https://www.cnblogs.com/yaozhongxiao/archive/2012/03/16/2400473.html
查看详细介绍如何用.o文件创建静态库.a和动态库.so文件。