记录下自己在编译C++源代码时的学习笔记与自己的理解,方便日后使用Linux编译C++源代码,为日后使用C++ 奠定基础.
静态库编译:
简介:
- 静态库对函数库的链接是放在编译时期完成的。
- 程序在运行时与函数库再无瓜葛,移植方便。
- 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
步骤:
从cpp 文件生成 (.o)文件
1. g++ -c 文件名.cpp
例子:
g++ -c GetPic.cpp
2. ar -crv [lib文件名].a [文件名].o (特殊说明: 库文件名有名目规则 ---> lib库文件名.o)
例子:
ar -crv libSomeOne.a GetPic.o
3.生成最终的可执行文件:
g++ [静态库文件名].a [调用静态库文件名的源文件].cpp -o [生成的可执行文件名]
例子:g++ saymain.cpp libsay.a -o saymain
动态库编译:
简介:
- 动态库把对一些库函数的链接载入推迟到程序运行的时期。
- 可以实现进程之间的资源共享。(因此动态库也称为共享库)
- 将一些程序升级变得简单。
- 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。
生成步骤:
1.生成.o文件
g++ -fPIC -c [源文件].cpp
2.生成动态库 .so 文件
g++ -shared -o [lib文件名].so [文件名].o (特殊说明: 库文件名有名目规则 ---> lib库文件名.so)
3.生成最终的可执行文件:
g++ main.cpp -L [库文件目录] -l[库文件名] (特殊说明: 库文件名与-l参数中间不能用空格,且库文件名是标准名目区中间名字,如libaa.so,那么库文件名就是aa)
4.因为是动态库的原因,库并不在系统环境中,此时执行可执行文件会报 :
error while loading shared libraries: libOkPath.so: cannot open shared object file: No such file or directory
解决:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:[库文件目录]
例子:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/cpppro