静态库:
1. 编译时链接;
2.浪费空间和资源,如果多个程序链接了同一个库,则每个生成的可执行文件就都会有一个库的副本,必然浪费系统的空间;
3.若静态库修改了,需要重新进行编译所有链接的程序
动态库:
1. 运行时链接
2. 运行时被链接,程序运行速度稍慢
3.动态库在程序运行时被链接,所以磁盘上只需要保留一份副本,因此节约磁盘空间。如果发现bug或者升级也很简单,只需要用新的库把原来的替换掉。
GCC编译流程:
1.预处理:C/C++源文件中,#开头的命令都是预处理命令,包括头文件,宏定义以及条件编译等。预处理就是将头文件插入到源文件中,把宏定义展开,根据条件编译选择使用代码,最后这些代码输出到.i文件等待下一步处理。
gcc -E hello.c -o hello.i
2.编译:将C/C++代码编译成汇编代码
gcc -S hello.i -o hello.s
3.汇编:将编译等到的文件翻译成一定格式的机器代码
gcc -c hello.s -o hello.o
4.链接:将上步生成的OBJ文件和系统的OBJ文件,库文件链接起来,生成可执行文件。
gcc hello.o
静态链接是在GCC编译中链接时一起打包到可执行文件;而动态库在程序编译时并不会链接导目标代码中,而是在程序运行时才载入。不同的应用程序如果调用相同的库,那么在内存中只需要有一份该共享库的实例,规避了浪费空间的问题。动态库是在程序运行时才载入,也解决了静态库对程序的更新,部署和发布带来的麻烦。用户只需要更新动态库即可。
生成静态库:
ar crv libfoo.a foo.c other.c
加载静态库:
g++ -o main main.cpp -L. -lfoo -static
生成动态库:
g++ -o libshare.so -fPIC -shared share1.cpp share2.cpp
加载动态库:
g++ -o main mian.cpp -L. -lshare
通过g++来指定路径:
g++ -o main main.cpp -Wl,-rpath=./ -L. -lshare
-Wl,-rpath是用来指定动态库的路径
此外,动态库指定路径有以下几种方法:
1. export更改LD_LIBRARY_PATH当前终端的环境变量
2.