VS2015 建立C 動態庫及使用

2022-05-04 18:12:15 字數 2515 閱讀 9938

**:

1.dll的特點

**復用是提高軟體開發效率的重要途徑。一般而言,只要某部分**具有通用性,就可將它構造成相對獨立的功能模組並在之後的專案中重複使用。比較常見的例子是各種應用程式框架,atl、mfc等,它們都以源**的形式發布。由於這種復用是「原始碼級別」的,源**完全暴露給了程式設計師,因而稱之為「白盒復用」。「白盒復用」的缺點比較多,總結起來有4點。 

暴露了源**;

多份拷貝,造成儲存浪費; 

容易與程式設計師的「普通」**發生命名衝突; 

更新功能模組比較困難,不利於問題的模組化實現; 

實際上,以上4點概括起來就是「暴露的源**」造成「**嚴重耦合」。為了彌補這些不足,就提出了「二進位制級別」的**復用。使用二進位制級別的**復用一定程度上隱藏了源**,對於緩解**耦合現象起到了一定的作用。這樣的復用被稱為「黑盒復用」。 

2.vs建立新乙個空的解決方案(乙個解決方案下可以有很多project)

2.建立dll

檔案------>新建------>專案------>win32控制台應用程式------>

選擇dll -- 勾選匯出符號 -- 不勾選預編譯標頭檔案

刪除stdafx.h 、stdafx.cpp、targetver.h、dllmain.cpp,把mydll.h修改成dllexport.dll。修改mydll.cpp中#include "stdafx.h" #include "mydll.h"改為 "dllexport.h"

如果生產dll和使用dll的工程在乙個解決方案中,我們可以指定dll輸出目錄

$(solutiondir)  ---  解決方案目錄

$(platform)       ---- 平台目錄(x86/x64)

$(configuration) --- 編譯模式(debug/release)

因為dll庫是函式的實現,lib裡面是函式的宣告,我們也指定他的輸出路徑

這是我們編譯工程:

這時在解決方案目錄下生成bin和lib目錄

3.建立usedll工程

使用dll

匯入標頭檔案  指定匯入

在執行之前我們要指定usedll工程的exe的輸出目錄

執行結果:

通過配置工程屬性來使用dll庫

呼叫:

#include "

stdafx.h

"#include

#include

#include

//使用pathremovefilespec函式

using

namespace

std;

#pragma comment(lib, "shlwapi.lib") //

這個庫也要有,不然會報鏈結錯誤

typedef

int(*myadd)(int a,int

b);typedef

int(*mysub)(int i,int

j);int

main()

; getmodulefilename(null,modulepath,max_path);

::pathremovefilespec(modulepath);

//c:\\testdemo\\debug

wstring dllpath =modulepath;

dllpath += l"

\\fundll.dll";

hmodule hmodule =loadlibrary(dllpath.c_str());

if(hmodule)

cout

<< fnmydll() << endl;//

呼叫dll中的函式

freelibrary(hmodule);

return0;

}

demo

vs2015編譯 pybind 動態庫

本人總結 pyd的檔案 引用 module的名字和 pybind定義的module名字一致,pybind11 module pyiotsdk,m pybind只需要引用標頭檔案即可。根據原文,加上自己的總結 也可以參考 建立visual sdudio 至少2015 win 32 console工程,...

VS2015靜態庫與動態庫的使用

靜態庫建立 略 往往我們使用第三方的比較常見,如果要自己團隊間建立使用也很簡單 標頭檔案的載入 庫檔案的載入 首先需要將 lib同樣拷貝到專案目錄下 方式一 使用 pragma comment lib,lib include stdafx.h include consollib.h include ...

VS2015靜態庫與動態庫的使用

標頭檔案的載入 庫檔案的載入 首先需要將 lib同樣拷貝到專案目錄下 方式一 使用 pragma comment lib,lib include stdafx.h include consollib.h include pragma comment lib,consollib.lib int mai...