在项目开发时,经常会用到第三方库,也会自己创建动态库给别人或者给自己其他的工程项目使用。
动态库
、静态库
。.so
,静态库的后缀为.lib
。创建动态库的语法格式:
gcc -fPIC -shared -o <库文件名称>.so 源文件名称.c
<库文件名称>如何命名? libxxx.so 更改的地方xxx
源文件名称.c 可以是多个.
例如:
[wbyq@wbyq sum]$ ls
sum.c sum.h
[wbyq@wbyq sum]$ gcc -fPIC -shared -o libsum.so sum.c
[wbyq@wbyq sum]$ ls
libsum.so sum.c sum.h
gcc <源文件> [选项参数]
常用的选项参数介绍:
-o <outfile> 指定编译之后生成的可执行文件名称
-c 表示生成.o文件
-I <path> 指定编译时搜索头文件的路径。可以指定多个头文件路径。
例如: gcc 123.c -I/work -I/home ...
-L <path> 指定编译时搜索库文件的路径。可以指定多个库文件路径。
例如: gcc 123.c -L/wor/lib -L/home/lib ...
-l <name> 指定编译时使用的库文件名称. 可以指定对个库文件名称.
如果我们使用的库文件名称是 libabc.so libsum.so
用法例如: gcc 123.c -labc -lsum
[wbyq@wbyq linux_c]$ ls
a.out app app.c app.o sum
[wbyq@wbyq linux_c]$
[wbyq@wbyq linux_c]$ gcc app.c
app.c:3:17: 错误:sum.h:没有那个文件或目录
[wbyq@wbyq linux_c]$ gcc app.c -I sum/
/tmp/ccCNE8sV.o: In function `main':
app.c:(.text+0x5a): undefined reference to `sum_val'
collect2: ld 返回 1
[wbyq@wbyq linux_c]$ gcc app.c -I sum/ -L sum/
/tmp/cccXsHyA.o: In function `main':
app.c:(.text+0x5a): undefined reference to `sum_val'
collect2: ld 返回 1
[wbyq@wbyq linux_c]$ gcc app.c -I sum/ -L sum/ -lsum
说明: 默认情况下系统搜索动态库的路径是/lib 、 /usr/lib
方法1: 直接将动态库拷贝到/lib 或者 /usr/lib 目录下。
[wbyq@wbyq linux_c]$ ./a.out
./a.out: error while loading shared libraries: libsum.so: cannot open shared object file: No such file or directory
[wbyq@wbyq linux_c]$ sudo cp sum/libsum.so /lib/
[sudo] password for wbyq:
[wbyq@wbyq linux_c]$ ./a.out
./a.out <int> <int>
[wbyq@wbyq linux_c]$ ./a.out 123 456
c=579
[wbyq@wbyq linux_c]$
方式2: 设置环境变量
[wbyq@wbyq sum]$ ls
libsum.so sum.c sum.h
[wbyq@wbyq sum]$ pwd
/mnt/hgfs/linux-share-dir/linux_c/sum
[wbyq@wbyq sum]$ cd ..
[wbyq@wbyq linux_c]$ ls
a.out app app.c app.o sum
[wbyq@wbyq linux_c]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/linux-share-dir/linux_c/sum
[wbyq@wbyq linux_c]$ ./a.out
./a.out <int> <int>
注意: 动态库如果静态库名字重名的时候,编译器优先使用动态库.
静态库的命名规则: libxxx.a
创建静态库的流程:
gcc xxx.c xxx.c xxx.c ... -c
例如: gcc sum.c -c
ar crv libxxx.a xxx.o xxx.o ....
例如: ar crv libmylib.a my_print.o my_math.o
[wbyq@wbyq linux_c]$ cd sum/
[wbyq@wbyq sum]$ ls
sum.c sum.h
[wbyq@wbyq sum]$ gcc sum.c -c
[wbyq@wbyq sum]$ ar crv libsum.a sum.o
a - sum.o
[wbyq@wbyq sum]$ ls
libsum.a sum.c sum.h sum.o
[wbyq@wbyq sum]$ cd ..
[wbyq@wbyq linux_c]$ ls
app.c sum
[wbyq@wbyq linux_c]$ gcc app.c -I sum/ -L sum/ -lsum
[wbyq@wbyq linux_c]$ ./a.out
./a.out <int> <int>