美文网首页
使用gcc、g++编译C/C++源程序,静态库和动态库创建方式

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

作者: XDgbh | 来源:发表于2018-07-04 23:13 被阅读152次

    后缀为.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文件。

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

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

    库的相关性处理办法

    库的相关性处理办法
    image.png
    image.png
    image.png

    相关文章

      网友评论

          本文标题:使用gcc、g++编译C/C++源程序,静态库和动态库创建方式

          本文链接:https://www.haomeiwen.com/subject/ihvyuftx.html