簡體   English   中英

構建新庫時包括庫的頭文件

[英]Including header files from libraries when building a new library

需要明確的是:我知道下面的示例演示了dll依賴性,即一個庫不是自包含的,而是依賴於另一個庫來起作用。

假設我正在創建一個運行時庫Utility.dll,其中包含各種通用的有用功能。 我創建了一個頭文件Utility.h,該文件包含在需要使用Utility.dll的其他文件中。 頭文件看起來像

#ifndef _UTILITY_H
#define _UTILITY_H

#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif

DLL_EXPORT void foo();
DLL_EXPORT void foo2();
....

#endif

當我將源代碼文件Utility.cpp編譯為機器代碼(轉換為Utility.dll)時,請確保已定義BUILD_DLL,以便DLL_EXPORT被__declspec(dllexport)取代。 這樣可以將函數導出到.dll文件。 每當我包含頭文件Utility.h並與導入庫(MS VS的Utility.lib,g ++的libUtility.a)鏈接並且定義BUILD_DLL時,Utility.h中的函數聲明就以__declspec(dllimport)開頭,告訴從.dll導入功能的編譯器(可以這么說)。

現在,假設我還正在構建另一個庫MyLibrary.dll,該庫要使用Utility.dll中的一些有用功能。 同樣,我將MyLibrary.h創建為

#ifndef _MYLIBRARY_H
#define _MYLIBRARY_H

#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif

DLL_EXPORT void myLibraryFunc1();
....

#endif

當我將MyLibrary.cpp編譯為MyLibrary.dll時,我包括Utility.h,並且還鏈接到Utility導入庫。

這引出了我的問題 :由於在編譯MyLibrary.dll時也定義了BUILD_DLL,這意味着Utility.h中的函數聲明也將讀取

__declspec(dllexport) void foo();
__declspec(dllexport) void foo2();
....

__declspec(dllimport) void foo();
__declspec(dllimport) void foo2();

在編譯MyLibrary.dll時,是否不希望它成為Utility.h中的函數聲明的__declspec(dllimport),而對於MyLibrary.h中的函數聲明是__declspec(dllexport)的?

這就是為什么您通常不命名此類宏BUILD_DLL而是BUILD_UTILITYBUILD_MYLIBRARY或類似名稱的原因。 同樣,declspec宏觀不應該DLL_EXPORT ,但UTILITY_EXPORTMYLIBRARY_EXPORT (或者UTILITY_APIMYLIBRARY_API )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM