=======================库=========================
静态链接库:
1、编译生成目标文件
gcc -c struct.c
2、创建静态库
ar cqs libstruct.a struct.o (顺序不能乱)
3、链接静态链接库,生成可执行文件
gcc main.c -static -L. -ltest -o main
动态链接库:
1、编译成动态链接库
gcc struct.c -fPIC -shared -o libstruct.so
2、链接动态链接库,生成可执行文件
gcc main.c -L. -lstruct -o main
3、设置库文件的环境路径
1)在bashrc或profile文件里用LD_LIBRARY_PATH定义,然后用source加载。
2)把库路径添加到ld.so.conf文件中,然后用ldconfig加载。
3)ldconfig /home/user/lib,仅能暂时性使用,若下次ldconfig时此目录下的动态链接库就不能被共享了。
gcc一些参数解析
-shared:指定生成动态链接库。
-static:指定生成静态链接库。
-fPIC:表示编译为位置独立的代码,用于编译共享库。目标文件需要创建成位置无关码,概念上就是在可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。
-L.:表示要连接的库在当前目录中。
-l:指定链接时需要的动态库。编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称。
-Wall:生成所有警告信息。
-ggdb:此选项将尽可能的生成gdb的可以使用的调试信息。
-g:编译器在编译的时候产生调试信息。
-c:只激活预处理、编译和汇编,也就是把程序做成目标文件(.o文件)。
-Wl,options:把参数(options)传递给链接器ld。如果options中间有逗号,就将options分成多个选项,然后传递给链接程序。
例子:
生成一个myhello的静态库 ,在hellotest.c 中静态链接myhello 的库
步骤1:
vim hello.c
#include<stdio.h>
int hello()
{
printf(“helloworld/n”);
}
步骤2:
编译生成目标文件 .o 文件
gcc –c hello.c –o hello.o
步骤3:
创建静态库
ar crs libmyhello.a hello.o
步骤4:
应用静态库:
vim hellotest.c
extern int hello(void); //extern 相当于include” hello ”
int main(void)
{
hello();
}
步骤5:
使用静态链接库
gcc –o hello hellotest.c –L. –lmyhello
./hello
显示:
helloworld
函数库分为静态库和动态库两种。
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
程序1: hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H
程序2: hello.c
#include <stdio.h>
void hello(const char *name)
{
printf("Hello %s!/n", name);
}
程序3: main.c
#include "hello.h"
int main()
{
hello("everyone");
return 0;
}
无论动态库还是静态库都需要用到.o文件来生成,先编译生成.o文件。
# gcc -c hello.c
1:创建静态库
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。
# ar cr libmyhello.a hello.o
使用静态库:只需要在你的源程序中加入包含你所需要使用到的函数的声明(即包含头文件),然后在gcc生成目标文件时候指明静态库就OK了(除非你包含的头文件在/usr/include,库文件在标准库/usr/lib,/lib下,否则你得显示指明他们的路径)
# gcc -o hello main.c -L. -lmyhello
# ./hello
Hello everyone!
删除静态库文件运行./hello,程序正常运行,说明静态库公用函数已经链接到目标文件。
动态库文件扩展名为.so。
# gcc -shared -fPCI -o libmyhello.so hello.o
动态库的使用与静态库使用方式一样
# gcc -o hello main.c -L. -lmyhello
# ./hello
./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory
哦!出错了。快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。
如何找到生成的动态库有3种方式:
1)把库拷贝到/usr/lib和/lib目录下。
(2)在LD_LIBRARY_PATH环境变量中加上库所在路径。
例如动态库libhello.so在/home/example/lib目录下:
$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/example/lib
(3) 修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。这样,加入的目录下的所有库文件都可见。
当静态库和动态库同名时, gcc命令将优先使用动态库。