環境:visual studio 2019
本篇主要描述怎麼創建一個dll庫,然後用隱式鏈接的方式讓exe鏈接dll。
以下內容假設已經知道C艹的動態庫基本概念,和一些基本的C艹語法。
項目結構
demo項目有兩個部分,
· app
· mathlib
mathlib只提供一個簡單的方法power(),app直接調用這個方法返回一個數的平方。
main.cc
#include <iostream>
#include "Math.h"
using namespace std;
int main(int argc, char const *argv[])
{
int a = 2;
cout<< "power by <math>: " << power(a) << endl;
return 0;
}
Math.h
#ifndef DEMO_MATH_LIB
#define DEMO_MATH_LIB
#ifdef __cplusplus
extern "C"{
#endif
_declspec(dllexport) int power(int a);
#ifdef __cplusplus
}
#endif
#endif //DEMO_MATH_LIB
Math.cpp
#include "Math.h"
#include <iostream>
using namespace std;
int power(int a)
{
cout << "using custom power" << endl;
return a * a;
}
Math.h中出現了很多宏定義,具體是什麼含義不是本篇的內容重點,會另起一篇來具體分析。這裏我們只從操作性角度來介紹,用人話來說這就是一篇操作手冊。
創建dll項目
visual studio 2019的項目是以solution來劃分的,我們這裏先創建一個dll的 sln。
創建新項目
填寫項目名
之後點創建就完了
刪除自帶的dllmain.cpp文件
一般創建的dll項目會自帶 dllmain.cpp,是默認用來做dll入口的。我們這裏不需要,把它刪掉就完了。同時刪掉的還有framework和pch
添加src和header
選擇現有項,
添加lib文件進去,然後稍微調下位置,頭文件放頭文件目錄下,不放也沒所謂。
修改預編譯頭
右鍵math_lib,屬性,進去C/C++的預編譯頭裏,關掉預編譯頭選項。否則你編譯會出現下面的錯誤,
在查找預編譯頭時遇到意外的文件結尾。是否忘記了向源中添加“#include “pch.h””?
生成
右鍵math_lib項目然後點生成,就可以產出dll文件了。
dll是在exe啓動的時候會去加載的動態鏈接庫。
lib也是我們需要的,它是靜態庫,在編譯exe的時候需要用來做靜態符號鏈接,但它不會編進exe裏。
創建exe項目
這次我們要創建控制檯應用
刪除自帶文件,添加我們的
下面的操作跟dll的操作差不多,添加完main.cc後差不多這個樣子
添加編譯依賴的頭文件和lib文件
添加前需要把Math.h複製到main.cc的同個目錄,然後添加到頭文件裏。不然編譯的時候會發生找不到符號錯誤。
添加完差不多這樣子
編譯生成
生成的結果,
現在我們有了exe了,但運行的話會直接調出進程。
因爲目錄下沒有dll文件。複製過來就行了。