預處理
gcc/g++ -e test.cpp
編譯主要動作:將預處理後的檔案轉換為彙編檔案,裡面為彙編指令
gcc/g++ -s test.cpp
彙編主要動作:將彙編檔案轉換為目標檔案, 生成.o檔案,即目標檔案
gcc/g++ -c test.cpp
主要動作:將目標檔案和庫檔案集成為可執行檔案
鏈結主要動作:將目標檔案和庫檔案集成為可執行檔案
g++ test.o -l usr/include/iostream
使用-o可以為可執行檔案命名
-c 生成.o目標檔案
-o可執行檔案命名
-shared 指定生成動態鏈結庫
-static 指定生成靜態鏈結庫
-l 要鏈結的庫所在目錄
-l 指定鏈結時需要的動態庫,隱含命名規則,即在前加lib,在後加.a或.so確定庫檔名
靜態庫是在可執行檔案中包含庫**的乙份完整拷貝,
這種方式有個很嚴重的缺點就是會造成多份冗餘拷貝。
靜態庫會在程式的鏈結階段被複製到程式中,所以程式在執行後是不會呼叫靜態庫的
動態庫在鏈結階段並沒有被複製到程式中
是程式執行的時候由系統動態的載入到記憶體中供程式呼叫,所以這裡解決了靜態庫早晨多份冗餘拷貝的缺點,系統只需要載入一次動態庫
不同的程式可以得到記憶體中相同的動態庫副本,因此可以節省大量的記憶體
靜態庫和動態庫都是由.o檔案生成
先建立三個檔案,分別為hello.c、hello.h、main.c
「hello.h" 如下
#ifndef __hello_h__
#define __hello_h__
void hello();
#endif
「hello.c」:
#include "hello.h"
#include >
void hello()
「main.c」
#include "hello.h"
int main(void)
1 先將hello.c編譯成hello.o
g++ -c hello.c
2 生成靜態庫檔案
ar cr libhello.a hello.o
3 主程式鏈結靜態庫檔案生成可執行檔案
g++ -o main main.c -static -lhello -l.
1 先將hello.c編譯成hello.o
g++ -c -fpic hello.c -o hello.o
2 生成動態庫檔案
g++ -shared hello.o -o libhello.so
3 主程式鏈結動態庫檔案生成可執行檔案
g++ -o main main.c libhello.so
4 執行
1、將該動態庫檔案所在路徑新增到環境變數
export ld_library_path=./
2、執行該可執行檔案
./main
C C 條件編譯靜態庫或動態庫
windows 下方法 1.方法一 vs工程中中直接新增 1.1在vs的屬性 常規 附加庫目錄,添上資料夾的路徑 例如 lib x64 1.2輸入的附加依賴項,新增上庫的名字,例如 dmapi.lib 1.3 對用到該庫的 進行,巨集包含,例如 ifdef log xy endif 1.4 當你在工...
Linux 下 C C 靜態庫 動態庫的區別
linux linux 下的庫必須以 lib開頭,用於系統識別 靜態庫 字尾 a 每次被呼叫都生成乙個副本 共享庫 動態庫 字尾.so 只有乙個副本 windows 靜態庫 字尾 lib 動態庫 字尾.dll 靜態庫的生成和使用 通常情況下,對函式庫的鏈結是放在編譯時期 compile time 完...
靜態庫動態庫
靜態庫動態庫 靜態庫 是在執行程式之前就已經加入到執行 中,成為執行程式的一部分來執行的,字尾名 a 動態庫 是在執行程式啟動時載入到執行 中,字尾名 so 靜態庫和動態庫區別 動態庫編譯速度慢,執行速度快,但是生成的程式體積較大,占用記憶體,然而動態庫較易公升級,就布局而言,動態庫 不易布局,執行...