(源文件可從上一篇查看)函數
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
參考:《後臺開發核心與應用實踐》