聊聊Linux下的静态库与动态库的生成与使用

一句话总结:静态库在链接阶段集成于程序中,程序生成可删除;动态库在程序运行时在/usr/lib/目录下查找调用,删除后错误,编译链接均需加上-fPIC

实验代码

fun.h

#ifndef _FUN_H_
#define _FUN_H_
#define ver 2.0
void print();

#endif
fun.cpp

#include <iostream>
#include "fun.h"
using namespace std;

void print()
{
	cout << "print fun" << endl;
}

main.cpp

#include <iostream>
#include "fun.h"
using namespace std;

int main()
{
	print();
	return 0;
}

1、静态库

zjy@ubuntu:~/libaray$ ls

fun.cpp  fun.h  main.cpp

zjy@ubuntu:~/libaray$ g++ -c fun.cpp 

zjy@ubuntu:~/libaray$ ls

fun.cpp  fun.h  fun.o  main.cpp

zjy@ubuntu:~/libaray$ ar -cr libfun.a fun.o

zjy@ubuntu:~/libaray$ ls

fun.cpp  fun.h  fun.o  libfun.a  main.cpp

zjy@ubuntu:~/libaray$ g++ main.cpp -lfun

/usr/bin/ld: cannot find -lfun

collect2: error: ld returned 1 exit status

zjy@ubuntu:~/libaray$ g++ main.cpp -L. -lfun

zjy@ubuntu:~/libaray$ ls

a.out  fun.cpp  fun.h  fun.o  libfun.a  main.cpp

zjy@ubuntu:~/libaray$ ./a.out 

print fun

zjy@ubuntu:~/libaray$ g++ -o main main.cpp -L. -lfun

zjy@ubuntu:~/libaray$ ls

a.out  fun.cpp  fun.h  fun.o  libfun.a  main  main.cpp

zjy@ubuntu:~/libaray$ ./main 

print fun

zjy@ubuntu:~/libaray


ar是用来创建静态库的命令

ar - create, modify, and extract from archives


2、动态库

zjy@ubuntu:~/libaray$ ls

fun.cpp  fun.h  main.cpp

zjy@ubuntu:~/libaray$ g++ -c -fPIC fun.cpp 

zjy@ubuntu:~/libaray$ ls

fun.cpp  fun.h  fun.o  main.cpp

zjy@ubuntu:~/libaray$ g++ -shared -fPIC -o libfun.so fun.o

zjy@ubuntu:~/libaray$ ls

fun.cpp  fun.h  fun.o  libfun.so  main.cpp

zjy@ubuntu:~/libaray$ g++ main.cpp -lfun

/usr/bin/ld: cannot find -lfun

collect2: error: ld returned 1 exit status

zjy@ubuntu:~/libaray$ g++ main.cpp -lfun -L.

zjy@ubuntu:~/libaray$ ls

a.out  fun.cpp  fun.h  fun.o  libfun.so  main.cpp

zjy@ubuntu:~/libaray$ ./a.out 

./a.out: error while loading shared libraries: libfun.so: cannot open shared object file: No such file or directory

zjy@ubuntu:~/libaray$ g++ -o main main.cpp -L. -lfun

zjy@ubuntu:~/libaray$ ls

a.out  fun.cpp  fun.h  fun.o  libfun.so  main  main.cpp

zjy@ubuntu:~/libaray$ ./main 

./main: error while loading shared libraries: libfun.so: cannot open shared object file: No such file or directory

zjy@ubuntu:~/libaray$ sudo cp libfun.so /usr/lib/

[sudo] password for zjy: 

zjy@ubuntu:~/libaray$ ./a.out 

print fun

zjy@ubuntu:~/libaray$ ./main 

print fun

zjy@ubuntu:~/libaray$ sudo rm /usr/lib/libfun.so

zjy@ubuntu:~/libaray$ ./a.out 

./a.out: error while loading shared libraries: libfun.so: cannot open shared object file: No such file or directory

zjy@ubuntu:~/libaray$ ./main 

./main: error while loading shared libraries: libfun.so: cannot open shared object file: No such file or directory

zjy@ubuntu:~/libaray


-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。(实验时Ubuntu下面编译的时候不带这个选项链接时会发生错误)

zjy@ubuntu:~/libaray$ g++ -shared -fPIC -o libfun.so fun.o

zjy@ubuntu:~/libaray$ g++ -c fun.cpp 

zjy@ubuntu:~/libaray$ g++ -shared -fPIC -o libfun.so fun.o

/usr/bin/ld: fun.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC

fun.o: error adding symbols: Bad value

collect2: error: ld returned 1 exit status

zjy@ubuntu:~/libaray


-L.:表示要连接的库在当前目录中




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值