c++动态链接库及静态链接库的生成与使用
c++動(dòng)態(tài)鏈接庫(kù)及靜態(tài)鏈接庫(kù)的生成與使用
1,新建控制臺(tái)工程xdltest,改屬性-配置屬性-常規(guī)-配置類型為 動(dòng)態(tài)庫(kù).dll或靜態(tài)庫(kù).lib
2,打開(kāi)工程后添加 dltest.h, dltest.cpp,其中.h與.cpp名字沒(méi)必要一樣
3,編寫代碼
----------------------------------------------
--dltest.h
#pragma once
_declspec(dllexport) void Print(const char* str);
----------------------------------------------
--dltest.cpp
#include<iostream>
#include"dltest.h"
void Print(const char* str)
{
std::cout << "dltest>> " << str << std::endl;
}
4,編譯,生成 <庫(kù)的名字是根據(jù)工程名生成的>
若是靜態(tài)庫(kù),則會(huì)生成 xdltest.lib.
若是動(dòng)態(tài)鏈接庫(kù)則生成 xdltest.lib 和 xdltest.dll
5,使用
(1)將xdltest.lib添加到 <屬性-配置屬性-鏈接器-輸入-附加依賴項(xiàng)>
(2)在<屬性-配置屬性-鏈接器-常規(guī)-附加庫(kù)目錄>中指定xdltest.lib的目錄
(3)在<屬性-配置屬性-c/c++-常規(guī)-附加包含目錄>中指定dltest.h的目錄
(4)在程序中 #include "dltest.h" 后即可使用Print("hello")輸出了
下面有三種方式使用庫(kù)函數(shù)
-----------------------------------------
--使用方式一
#include "stdafx.h"
#include "abc.h" //包含庫(kù)的頭文件
int main()
{
Print("hello,world");
return 0;
}
-----------------------------------------
--使用方式二
#include "stdafx.h"
void Print(const char* str); //聲明庫(kù)中的函數(shù),使編譯通過(guò)
int main()
{
Print("hello,world");
return 0;
}
-----------------------------------------
--使用方式三
#include "stdafx.h"
_declspec(dllimport) void Print(const char* str); //從庫(kù)中導(dǎo)入進(jìn)工程
int main()
{
Print("hello,world");
return 0;
}
6,運(yùn)行
若是動(dòng)態(tài)鏈接庫(kù)則必須把dll文件拷到exe目錄下才能運(yùn)行
原理:
.h文件用于編譯,使程序在語(yǔ)法上檢測(cè)通過(guò),利用這個(gè)原理,
可以不使用.h文件而直接將需要使用的庫(kù)函數(shù)在使用前聲明出來(lái)
.lib文件用于鏈接,若是靜態(tài)鏈接庫(kù),直接將函數(shù)實(shí)現(xiàn)寫入了exe中,
若是動(dòng)態(tài)鏈接則是在exe中留下函數(shù)簽名并標(biāo)記它是運(yùn)行時(shí)動(dòng)態(tài)加載的
------------------------------------------------------------------------------------------------------
需要注意的是:
1,C#只能調(diào)用 C/C++的DLL,而不能調(diào)用lib,
2,C++生成的DLL中,函數(shù)名被改了(各編譯器而不同),而C#調(diào)用C++ DLL時(shí)需要指定函數(shù)名字,因此會(huì)出錯(cuò),找不到函數(shù)
對(duì)應(yīng)方法是:生成C風(fēng)格的DLL,它的函數(shù)是沒(méi)改名字的。
C風(fēng)格的DLL中函數(shù)聲明加上 exterun "C",如:
?exterun "C"?_declspec(dllexport) void Print(const char* str);
?
posted on 2018-07-27 18:45 時(shí)空觀察者9號(hào) 閱讀(...) 評(píng)論(...) 編輯 收藏
總結(jié)
以上是生活随笔為你收集整理的c++动态链接库及静态链接库的生成与使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【转】C# 调用 C++ 数据转换
- 下一篇: C++全总结