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++