c c 靜態庫動態庫( )

2021-10-09 15:33:45 字數 1752 閱讀 9870

預處理

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 靜態庫和動態庫區別 動態庫編譯速度慢,執行速度快,但是生成的程式體積較大,占用記憶體,然而動態庫較易公升級,就布局而言,動態庫 不易布局,執行...