首頁 > 軟體

c++動態庫呼叫的實現

2022-07-01 14:02:55

在平時的開發中某些情況,動態庫和靜態庫是程式開發的不二法門,例如封裝一個庫,供別人呼叫(紀錄檔庫、字串處理庫、裝置資訊採集庫等),比如接入第三方系統或者平臺,等等是非常重要的,筆者最早接觸的MFC時就有dll(VC++深入詳解)及雞啄米的MFC環節,後面隨著QT的盛行(國產化的推進),QT開始廣泛應用,裡面也有動態庫,就筆者最近的專案為例,這裡記錄下從庫的生成到最後的呼叫;

一、生成dll

1.安裝vs開發工具(2017);

2.新建c++ dll 工程;

3.實現.h和.cpp,將新建預設的.h和.cpp移除;

OSCommonDefine.h

#ifndef __BASE_OSCOMMONDEFINE_H__
#define __BASE_OSCOMMONDEFINE_H__
 
#define AT_DLLEXPORT __declspec(dllexport)
 
#endif // __BASE_OSCOMMONDEFINE_H__

CStringUtils.h

//-----------------------------------------------------------------------------
// Copyright (c) 2022, xxx
// All rights reserved.
//
// 摘要: CStringUtils.h 字串工具類宣告
// 當前版本: 1.0
// 作者: Zhang Lei
// 日期:2022.06.28
// 版本說明:類初始版本實現
//-----------------------------------------------------------------------------
 
#ifndef __BASE_CSTRINGUTILS_H__
#define __BASE_CSTRINGUTILS_H__
 
#include "OSCommonDefine.h"
#include <string>
#include <vector>
using namespace std;
 
// CStringUtils類定義
class AT_DLLEXPORT CStringUtils
{
public:
    // 字串轉大寫
    static string& ToUpper(string& strContent);
    // 字串轉小寫
    static string& ToLower(string& strContent);
    // 字串忽略大小寫比較
    static int CompareNoCase(const string& strContent, const string& strContentCmp);
};
 
#endif // __BASE_CSTRINGUTILS_H__

 CStringUtils.cpp

//-----------------------------------------------------------------------------
// Copyright (c) 2022, xxx
// All rights reserved.
//
// 摘要: CStringUtils.h 字串工具類宣告
// 當前版本: 1.0
// 作者: Zhang Lei
// 日期:2022.06.28
// 版本說明:類初始版本實現
//-----------------------------------------------------------------------------
 
#include <string>
#include <algorithm>
#include "../../include/CStringUtils.h"
using namespace std;
 
//-----------------------------------------------------------------------------
// 功能: 字串轉大寫
// 引數:
// strContent: 待轉的字串
// 返回值: 返回轉換後字串的參照物件
// 建立者: Zhang Lei
// 日期:2022.06.28
//-----------------------------------------------------------------------------
string& CStringUtils::ToUpper(string& strContent)
{
    transform(strContent.begin(), strContent.end(), strContent.begin(), ::toupper);
    return strContent;
}
 
//-----------------------------------------------------------------------------
// 功能: 字串轉小寫
// 引數:
// strContent: 待轉的字串
// 返回值: 返回轉換後字串的參照物件
// 建立者: Zhang Lei
// 日期:2022.06.28
//-----------------------------------------------------------------------------
string& CStringUtils::ToLower(string& strContent)
{
    transform(strContent.begin(), strContent.end(), strContent.begin(), ::tolower);
    return strContent;
}
 
//-----------------------------------------------------------------------------
// 功能: 字串忽略大小寫比較
// 引數: strContent 字串 strContentCmp 比較的字串
// 返回值: 比較結果
// 建立者: 2022.06.28
// 建立日期: 2022.06.28
//-----------------------------------------------------------------------------
int CStringUtils::CompareNoCase(const string& strContent, const string& strContentCmp)
{
#if defined(_WIN32)
    return _stricmp(strContent.c_str(), strContentCmp.c_str());
#elif defined(__linux__)
    return strcasecmp(strContent.c_str(), strContentCmp.c_str());
#endif
}

4.生成dll,編譯報錯;

 去掉預編譯頭

成功

5.說明:

一般要將.h和.cpp分開,畢竟.h是對外呼叫的,要和管理;

二、呼叫dll

1.新建測試程式,這裡新建一個控制檯應用程式;

2.呼叫:

#include <iostream>
#include "../../include/CStringUtils.h"
 
int main()
{
	std::string str = "I love China";
 
	std::cout << "Hello World!n";
	std::cout << CStringUtils::ToUpper(str) << std::endl;
	std::cout << CStringUtils::ToLower(str) << std::endl;
}

在工程中設定呼叫庫名和路徑: 

 4.成功輸出:

 到此這篇關於c++動態庫呼叫的實現的文章就介紹到這了,更多相關c++動態庫呼叫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com