多層動態庫的編譯及使用

2022-03-22 12:44:59 字數 2570 閱讀 9973

程式設計之路剛剛開始,錯誤難免,希望大家能夠指出。

假如生成乙個動態庫a,然後動態庫b的生成又呼叫了動態庫a,那麼凡是呼叫了動態庫b的程式或者庫,需要既鏈結動態庫a也要鏈結動態庫b,這也是動態庫最重要的特性,不然就叫靜態庫了,可以仔細想想下面這段話:

如果將程式鏈結到共享庫,那麼鏈結器就不會把庫中的目標模組複製到可執行檔案中,而是在可執行檔案中寫入一條記錄,以表明可執行檔案在執行時需要使用該共享庫。一旦在執行時將可執行檔案載入記憶體,一款名為「動態鏈結器」的程式會確保將可執行檔案所需的動態庫找到,並載入記憶體,隨後實施執行時鏈結,解析可執行檔案中的函式呼叫,將其與共享庫中相應的函式定義關聯起來。在執行時,共享庫**在記憶體中只需保留乙份。且可供所有執行中的程式使用。 --<

先來看下目錄結構:

直接上所有cpp檔案:

1

/*cpci.h

*/2 #include "

../parsedbc/parsedbcinfo.h"3

intcpci();45

/*cpci.cpp

*/6 #include "

cpci.h"7

intcpci()811

12/*

parsedbcinfo.h

*/13

intparsedbc();

1415

/*parsedbcinfo.cpp

*/16 #include "

parsedbcinfo.h"17

intparsedbc()

1821

22/*

main.cpp

*/23 #include "

cpci.h

"24 #include 25

intmain()

26

各目錄的makefile檔案(寫的有點菜):

1

#頂層目錄的makefile

2 source =main.cpp

34 subdirs =parsedbc cpcicard

56 target =demo78

all: subdirs_make $(target)910

subdirs_make:

11 @for dir in $(subdirs); do $(make) -c $$dir ; done

1213

$(target):

14 g++ main.cpp -o $(target) -i./cpcicard -lcpci -l./cpcicard -lparsedbcinfo -l./parsedbc

1516

clean: subdirs_clean target_clean

1718

target_clean:

19 rm -r $(target)

2021

subdirs_clean:

22 @for dir in $(subdirs); do $(make) -c $$dir clean; done

1

#cpcicard目錄的makefile

2 source =cpci.cpp

34 obj = $(source:.cpp=.o)

56 target =libcpci.so78

all:$(target)910

$(obj): $(source)

11 g++ -c $(source) -i../parsedbc -lparsedbcinfo -l../lparsedbc

1213

$(target): $(obj)

14 g++ -shared -fpic -o $(target) $(obj) -lparsedbcinfo -l../parsedbc

1516

clean:

17 rm -r $(target) $(obj)

1

#parsedbc目錄的mkaefile

2 source =parsedbcinfo.cpp

34 obj = $(source:.cpp=.o)

56 target =libparsedbcinfo.so78

all: $(target)910

$(obj): $(source)

11 g++ -c $(source)

1213

$(target): $(obj)

14 g++ -shared -fpic -o $(target) $(obj)

1516

clean:

17 rm -r $(target) $(obj)

執行結果:

編譯CUDA動態鏈結庫及使用

除了直接在專案中使用cu或cuh來編寫cuda 之外,還可以將cuda相關操作 放在乙個dll專案中,將專案編譯成動態鏈結庫dll,然後在需要使用的專案中引用這個dll並呼叫其內部函式即可。現在新建乙個dll專案,專案名稱為test00302,如下圖所示 現在在專案中新建乙個名為test.cu的檔案...

c 動態庫多層動態載入的問題

問題描述 今有第三方庫曰xplico,將xplico.c中的main函式改寫成xplico main然後修改makefile,將之由可執行程式改造成動態庫libxplico.so 然後編寫測試程式test.cpp 與libxplico.so放到同一路徑下 其內容如下 include include ...

vs編譯動態鏈結庫的方法及使用

1 編譯動態鏈結庫 1 在vs中新建專案,把要編譯的動態鏈結庫新增到專案裡 2 重新生成就行了,然後會在輸出目錄 debug 下生成dll檔案和lib檔案。坑 1 鏈結出現找不到 msvcrt winxp.obj。解決辦法 2 配置專案屬性。也就是讓專案能找到相關的庫 2 連線出現error lnk...