1.静态函数库
程序执行之前就加载目标的程序中去了,静态库可以对源代码进行加密,只提供函数库供他人使用。
静态库的创建与使用
(1)使用gcc +材料 -c 获得 ".o"后缀文件
(2)使用ar软件 生成静态库 ar -rcs +库名(libxxx.a)+xxx.o
(3)编译链接静态库
例:main.c func.c func.h 三个文件 ,main.c调用了func.c
1.使用gcc +材料 -c 获得 ".o"后缀文件
gcc func.c -c
生成文件:func.o
2.使用ar生成 以 ".a"为后缀 ar rcs 库名(libxxx.a) +材料(xxx.o)
ar rcs libtestfunc.a func.o
生成文件:lintestfunc.a
3.使用静态库 ,使用gcc main -ltestfunc -L ./
gcc main.c -ltestfunc -L ./
输出可执行文件:a.out
// -l 是链接用的库,库名称砍头去尾,例 libtestfunc.a ,使用 -ltestfunc 即可
// -L 告诉编译器从指定的路径去找,默认会从 /usr/lib /usr/local/lib 去找)
2.动态函数库
动态库和共享库时一个东西,文件后缀是".so" ,程序只想是动态(临时)由目标程序所调用.
动态库的命名规则:
基本上动态库都必须以"lib"为前缀,下来是动态库的名称(这个自定义),下来是".so",最后是版本的信息
动态库的制作
(1)编译生成动态库:gcc –fPIC –shared –o libxxx.so myxxx.c,得到".so"
// -fPIC 用于编译阶段,在生成目标文件是就得使用该选项,以生成位置无关的代码。
// -shared 指定生成动态库。
动态库的使用
例:main.c,count.c,count.h 三个文件 main.c 调用了count.c
编译生成动态库得到".so"
gcc –fPIC –shared –o libcount.so count.c
得到:libcount.so
编译 gcc main.c -lcount -L ./ 生成 a.out,-lcount表示链接libcount.so
直接运行a.out会得到以下的错误提示
./a.out: error while loading shared libraries: libcount.so: cannot open shared object file: No such file or directory
提示你找不到libcount.so这个库,因为动态库是程序执行是临时加载到进去的。
解决方法一:将libcount.so拷贝到 /usr/lib/ 里面去,它执行的时候就会从/usr/lib/ 里面去找,那如何让它从当前路径开始去找呢?,那就要用到第二种方法。
解决方法二:通过修改环境变量LD_LIBRARY_PATH来指定动态库搜索的路径。
export LD_LIBRARY_PATH="(当前库的绝对路径)"
但是这个环境变量是临时的只是针对于当前页面或者窗口,所以可以写一个脚本 start.sh
export LD_LIBRARY_PATH="(当前库的绝对路径)"
./a.out
在给start.sh 加上可执行权限(chmod +x start.sh)就ok啦,这样不管换几个窗口页面都可以执行。