MacOS靜態鏈結和動態鏈結

2021-10-24 21:15:41 字數 1313 閱讀 9602

假設我們有乙個util.cpp檔案和main.cpp檔案,在main檔案中呼叫util.cpp檔案中定義的函式。我們把util.cpp檔案製作成靜態庫和動態庫。

生成目標檔案

g++ -c util.cpp -o util.o
打包靜態庫

ar crv libutil.a util.o
生成動態庫

g++ -shared -fpic -o libutil.so util.o
使用靜態庫

g++ -g main.cpp libutil.a -o a.out
使用動態庫

g++ -g -std=c++11 main.cpp -l. -lutil -o a.out
當然,以上這幾條指令如果你覺得繁瑣的話,也可以寫到乙個makefile檔案一鍵執行

target:

mkdir -p output

g++ -c util.cpp -o ./output/util.o -std=c++11

ar crv ./output/libutil.a ./output/util.o

g++ -shared -fpic -o ./output/libutil.so ./output/util.o

rm ./output/util.o

g++ -g main.cpp ./output/libutil.a -o a.out -std=c++11

#g++ -g -std=c++11 main.cpp -l./output -lutil -o a.out

rm -rf *.dsym

clean:

rm -rf ./output *.out *.dsym

#include#include "util.h"

using namespace std;

int main()

; cout << util::sum(nums) << endl;

return 0;

}

#include#includeclass util ;
#include "util.h"

int util::add(int a, int b)

int util::sum(const std::vector& nums)

return ans;

}

靜態鏈結和動態鏈結

靜態載入dll dll工程b 專案屬性 配置屬性 常規 配置型別 動態庫 dll 在宣告檔案中,宣告匯出函式 declspec dllexport int xx 如果是c檔案,要在c 檔案中被呼叫,註明extern c 可以 ifdef cplusplus extern c endif 呼叫dll的...

靜態鏈結和動態鏈結

1 靜態鏈結庫只包含 lib檔案 動態鏈結庫包含 lib檔案和dll檔案,靜態鏈結庫中不能再包含其他的動態鏈結庫或者靜態庫,而在動態鏈結庫中還可以再包含其他的動態或靜態鏈結庫。此外他們都會用到定義了函式和相關資料結構的.h標頭檔案,其中 h標頭檔案是編譯時必須的,lib是鏈結時需要的,dll是執行時...

靜態鏈結和動態鏈結

動態鏈結庫 靜態庫 import庫區別 windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態鏈結庫中。其中有3個最重要的dll,kernel32.dll,它包含用於管理記憶體 程序和執行緒的各個函式 user32.dll,它包含用於執行使用者介面任務 如視窗的建立和訊息的傳送 的各...