add.h
#ifndef _add_h_
#define _add_h_
intadd
(int a,
int b)
;#endif
add.cpp
#include
"add.h"
intadd
(int a,
int b)
sub.h
#ifndef _sub_h_
#define _sub_h_
intsub
(int a,
int b)
;#endif
sub.cpp
#include
"sub.h"
intsub
(int a,
int b)
main.cpp
#include
"add.h"
#include
"sub.h"
#include
"iostream"
using
namespace std;
intmain()
將add.cpp與sub.cpp編譯成.0檔案
g++
-c add.cpp
g++-c sub.cpp
生成檔案add.o sub.o,-c的編譯選項,表示只執行到編譯,輸出目標檔案。
由.o檔案建立靜態庫(.a)檔案
ar cr libmymath.a sub.o add.o
會生成libmymath.a檔案
在程式中使用靜態庫
g++
-o main main.cpp -l.
-lmymath
生成目標mian,並執行
g++
-fpic -o add.o -c add.cpp
g++-fpic -o sub.o -c sub.cpp
g++-shared -o libmymath.so add.o sub.o
或者一步解決
g++-fpic -shared -o libmymath.so add.cpp sub.cpp
生成目標檔案
g++
-o main main.cpp -l.
-lmymath
./mian
報錯error while loading shared libraries: libmymath.so: cannot open shared object file: no such file or directory
因為找不到動態庫檔案libmymath.so,程式執行時,會在/usr/lib和/lib等目錄下查詢需要的動態庫檔案,找到就載入動態庫
1、編譯目標**時指定的動態庫搜尋路徑
2、環境變數ld_ld_library_path指定的動態庫搜尋路徑
3、配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑
4、預設動態庫搜尋路徑/lib
5、預設動態庫搜尋路徑/usr/lib
1、將檔案libmymath.so複製到/usr/lib中
cp libmymath.so /usr/lib/
2、修改環境變數ld_library_path
export ld_library_path=
/usr/lib:$ld_ld_library_path
sudo ldconfig
某程式要呼叫動態庫函式,作業系統會首先檢視正在執行的程式,看在記憶體中是否有此函式的拷貝,有的話,就會共享哪乙個拷貝。
靜態鏈結庫,每個程式需要呼叫都會拷貝到自己的**段中
只要動態庫給該程式的介面沒變,只需要重新用新生成的動態庫替換原來的就可以。如果是靜態庫,使用庫的函式需要重新編譯
可以明確的指明在什麼情況下,載入哪個動態庫。有乙個很大的軟體,每次執行的時候,根據操作需求去將一小部分載入記憶體
在編譯的時候,已經將庫函式載到程式中去了,而動態庫函式在執行時才被裝在。所有在程式執行的時候,用靜態庫速度更快
後端開發核心技術 第5章除錯 strace
所有作業系統在其核心都有一些內建的函式,這些函式可以用來完成一些系統級別的功能,這些函式被稱為系統呼叫,這些函式代表了使用者空間到核心空間的一種轉換 例如使用者空間呼叫open函式,在核心空間中則會呼叫sys open。系統呼叫並不直接返回錯誤碼,而是將錯誤碼放入到乙個名為errno的全域性變數中。...
後端開發核心技術 第7章網路IO模型 poll
include intpoll struct pollfd fds,unsigned int nfds,int timeout 1 fds 指向乙個結構體陣列的第0個元素的指標,每個陣列元素都是乙個struct pollfd結構,用於指定測試某個給定的fd的條件 2 nfds 表示fds結構體陣列的...
後端開發核心技術 第8章 網路分析工具 lsof
lsof list open files 是乙個列出當前系統開啟檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連線和硬體。所以如傳輸控制協議 tcp 和使用者資料報協議 udp 套接字等,系統在後台都為該應用程式分配了乙個檔案描述符,無論這...