(源文件可从上一篇查看)函数
g++ -c printA.cpp g++ -c printB.cpp
生成的文件为 printA.o printB.o ,-c 的编译选项,表示只执行到编译,输出目标文件。code
ar cr libmyprint.a printA.o printB.o
生成的静态库文件就是libmyprint.a,命名规范是以lib 开头(前缀),紧接着是静态库名,以.a为后缀名内存
ar 命令的 c 选项:建立一个库。开发
ar 命令的 r 选项:在库中插入模块(替换);若是若干模块中有一个模块在库中不存在,ar会显示一个错误信息,而且不替换其余同名模块。编译器
g++ -o main main.cpp -L. -lmyprint
g++ -fPIC -o printA.o -c printA.cpp g++ -fPIC -o printB.o -c printB.cpp
g++ -shared -o libmyprint.so printA.o printB.o
(1) ,(2)也能够一步到位:编译
g++ -fPIC -shared -o libmyprint.so printA.cpp printB.cpp
动态库的搜索路径的前后顺序是:class
为此解决步骤为:test
将动态库文件 拷贝至目录 /usr/lib 中后台
cp libmyprint.so /usr/lib/
修改环境变量 LD_LIBRARY_PATH,并使修改生效变量
export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH sudo ldconfig
g++ -o main main.cpp -L. -lmyprint
代码和静态库生成可执行文件同样
-fPIC :表示编译为位置独立的代码
-Lpath:表示从path 目录中搜索库文件,若从当前路径 . 查找,选项为 -L. (有一点)
-Iname:name为动态库的真正名字,编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面+lib,后面加.so肯定库的名称,即实际动态库文件名为 libname.so
参考:《后台开发核心与应用实践》