【问题标题】:Including header files from libraries when building a new library构建新库时包括库中的头文件
【发布时间】:2015-09-28 08:14:39
【问题描述】:

要明确: 我知道下面的示例演示了 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)链接并执行 not 定义 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) 吗?

【问题讨论】:

  • 你试过用#undef BUILD_DLL #include "utility.h" #define BUILD_DLL包装utility.h吗?
  • 这很好。但是,如果我在一个程序中同时包含 MyLibrary.h 和 Utility.h,那么该行是否会导致编译器处理 MyLibrary.h 时始终定义 BUILD_DLL,因为您说 #define BUILD_DLL ?
  • 您不必在#include "utility.h" 之后执行#define BUILD_DLL。我只是展示了如何摆脱符号,包含文件,然后重新定义符号。
  • 哦,谢谢你的提示,我以前不知道#undef。

标签: c++ dll shared-libraries declspec


【解决方案1】:

这正是您通常不将此类宏命名为 BUILD_DLL 而是命名为 BUILD_UTILITYBUILD_MYLIBRARY 或类似名称的原因。同样,declspec 宏不应该是DLL_EXPORT,而是UTILITY_EXPORTMYLIBRARY_EXPORT(或者可能是UTILITY_APIMYLIBRARY_API)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多