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