目录
参考资料:gcc生成静态库.a和动态库.so_HarrietLH的博客-CSDN博客
一.用GCC生成生成静态库和动态库
1.写出hello代码
hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif//HELLO_H
hello.c
#include<stdio.h>
void hello(const char *name)
{
printf("Hello %s\n",name);
}
main.c
#include"hello.h"
int main()
{
hello("everyone");
return 0;
}
2.将 hello.c 编译成.o 文件
gcc -c hello.c
3.由.o 文件创建静态库
创建静态库用
ar
命令
输入下列命令
ar -crv libmyhello.a hello.o
4在程序中使用静态库
gcc main.c libmyhello.a -o hello
4.1 验证静态库特点
rm libmyhello.a
5. 由.o 文件创建动态库文件
输入以下命令
gcc -shared -fPIC -o libmyhello.so hello.o
命令中的-o一定不能够被省略
6.在程序中使用动态库
解决方法:到 /usr/lib 中找库文件的,将文件 libmyhello.so 复制到目录/usr/lib 中就 OK 了
mv libmyhello.so /usr/lib
7.那当静态库和动态库同名时,gcc 命令会使用哪个库文件
gcc编译得到.o文件 gcc -c hello.c
创建静态库 ar -crv libmyhello.a hello.o
创建动态库 gcc -shared -fPIC -o libmyhello.so hello.o
使用库生成可执行文件 gcc -o hello main.c -L. -lmyhello
执行可执行文件 ./hello
在执行可执行文件,会报一个错误,程序会优先使用动态库
二.Linux 下静态库.a 与.so 库文件的生成与使用
1.创建作业目录
mkdir test2
打开目录
cd test2
2.编写代码
A1.c
#include<stdio.h>
void print1(int arg)
{
printf("A1 print arg:%d\n",arg);
}
A2.c
#include<stdio.h>
void print2(char *arg)
{
printf("A2 printf arg:%s\n",arg);
}
A.h
#ifndef A_H
#define A_H
void print1(int);
void print2(char *);
#endif
test.c
#include<stdio.h>
#include"A.h"
int main()
{
print1(1);
print2("test");
exit(0);
}
3.静态库.a 文件的生成与使用
生成目标文件:gcc -c A1.c A2.c
生成静态.a文件:ar crv libafile.a A1.o A2.o
使用.a 库文件,创建可执行程序:gcc -o test test.c libafile.a
./test
4.共享库.so 文件的生成与使用
生成目标文件:gcc -c -fpic A1.c A2.c
生成共享库.so 文件:gcc -shared *.o -o libsofile.so
使用.so 库文件,创建可执行程序:gcc -o test test.c libsofile.so
./test
发现错误,运行ldd test
发现确实是找不到对应的.so 文件
这是由于
linux
自身系统设定的相应的设置的原因,即其只在
/lib and /usr/lib
下搜索对应
的
.so
文件,故需将对应
so
文件拷贝到对应路径
sudo cp libsofile.so /usr/lib
./test