包含来自 DLL 的标头的理想方法?
Posted
技术标签:
【中文标题】包含来自 DLL 的标头的理想方法?【英文标题】:Ideal way to include headers from a DLL? 【发布时间】:2013-03-12 13:17:04 【问题描述】:我一直在使用多个项目设置进行测试,其中控制台应用程序访问来自多个 DLL 的函数。
我考虑过如何在控制台应用程序中包含 DLL 的标头。我目前的实现如下,但管理起来很头疼,甚至有时会遇到错误:
每个 DLL 项目都有一个名为“Include”的文件夹 Console 应用程序项目引用每个 DLL 项目的 Include 文件夹(如 msdn guide to working with DLLs 所建议的) 每个 DLL 项目都包含一个标头,其中包含该项目中的所有标头 然后控制台应用程序 #include 这些“主标头” 每个项目都使用预编译的头文件“stdafx”,每个文件都包含它。在我开始重载运算符之前效果很好。 我相信悲痛是由预编译的标头以某种方式引起的,这是我当前使用 stdafx 的示例:
#define DLL // Found in every DLL, not in the console project
#ifdef DLL
#define DLLEI __declspec(dllexport)
#else
#define DLLEI __declspec(dllimport)
#endif
#include <iostream>
#include <vector>
#include "Include\Engine.h"
using namespace std;
有了这个,我有时会遇到一些不相关的随机编译器错误,我可以通过从“主标头”中排除标头并在控制台应用程序中单独包含麻烦制造者来解决这些错误。
建议什么可以做得更好?
【问题讨论】:
你可以通过从一个通用的全局头文件中删除using namespace std;
这一行来消除一堆问题。
@CodyGray 是的。我只是暂时使用它来更快地测试。使用绝对路径 (std::) 并没有解决我的问题,所以我暂时把它放在那里。
【参考方案1】:
__declspec(dllexport)
和__declspec(dllimport)
定义应该放在每个公共 Dll 包含文件中,或者至少放在包含所有其他文件的主 Dll 公共包含文件中。这些定义不应在stdafx.h
中。
#define DLL // Found in every DLL, not in the console project
这是不正确的,每个 Dll 都必须有唯一的预处理器定义。在您的情况下,一个 Dll 依赖于另一个 Dll,它始终将另一个 Dll 函数编译为 __declspec(dllexport)
确保每个标题的开头都有#pragma once
。
考虑为所有项目使用通用的Include
目录。
正如 cmets 中已经提到的,using namespace
只能在源文件中使用。
【讨论】:
【参考方案2】:这篇文章回答了我不少问题。
http://www.codeproject.com/Articles/6351/Regular-DLL-Tutor-For-Beginners
【讨论】:
以上是关于包含来自 DLL 的标头的理想方法?的主要内容,如果未能解决你的问题,请参考以下文章
在Javascript中将对象转换为包含多个对象的数组的理想方法是啥? (允许 ES6)