300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 编译c语言动态库 使用gcc g++编译C/C++源程序 静态库和动态库创建方式

编译c语言动态库 使用gcc g++编译C/C++源程序 静态库和动态库创建方式

时间:2018-09-28 04:20:46

相关推荐

编译c语言动态库 使用gcc g++编译C/C++源程序 静态库和动态库创建方式

后缀为.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动态库文件放在当前目录)

静态库.a和动态库.so文件的创建方式

创建静态库和动态库的方式

库的相关性处理办法

库的相关性处理办法

image.png

image.png

image.png

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。