linux下静态库与动态库

linux C/C++ 编译静态库.a 或者动态库.so

无论是静态库还是动态库,只是函数调用的时间不一样,编译的话都需要相应的目标文件

所以

例如有 a.c b.c 为依赖文件,c.c中调用a.c b.c中的函数

1、生成目标文件

  C语言的话用gcc

   gcc -c a.c b.c

  C++用g++

  g++ -c a.c b.c

这样生成了 a.o b.o

2、生成库文件

  1)静态库.a

  对于静态库归类为文档 (archive)

  所以用ar -r 来实现

  ar -r libc.a a.o b.o

  这样就利用a.o b.o 产生了静态库文件libc.a

  2)动态库

  gcc -fpic -shared  a.o b.o -o libc.so

关于库文件的命名一般以lib+名字+.o/.so

这是因为在调用的时候只需以 -l+名字调用就可以了 

同理对与c++来讲,调用g++就可以了。

3、库文件的使用

  1)静态库的使用

  gcc  c.c -lc -L ./ -o c

    -L 指定静态库的路径  ,不然会报路径存在错误。

 2)动态库的使用

  gcc  c.c -lc -L ./ -o c

  但是动态库报了下面的错误,查找相应文档提示,linux下不会自动连接当前文件夹,所以用 export LD_LIBRARY_PATH=./ 指定一下路径即可

./hello: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory

export LD_LIBRARY_PATH=./

题外话:

  gcc与g++的区别

  编译一般分为编译和链接

对于c和c++的编译阶段都是一样的,g++也是调用的gcc来执行的,不信的话可以自己找些资料看一下

在链接的阶段,g++也是使用gcc链接了一些c++的标准链接库。 -lstdc++

原文地址:https://www.cnblogs.com/lobsterIT/p/5654118.html