[英]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_UTILITY
和BUILD_MYLIBRARY
或類似名稱的原因。 同樣,declspec宏觀不應該DLL_EXPORT
,但UTILITY_EXPORT
和MYLIBRARY_EXPORT
(或者UTILITY_API
和MYLIBRARY_API
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.