【发布时间】: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