包含DLL头文件的理想方法?

时间:2013-03-12 13:17:04

标签: c++ dll

我一直在测试具有多个项目设置的东西,其中控制台应用程序从多个DLL访问函数。

我考虑过如何在控制台应用程序中包含DLL的头文件。我目前的实现如下,但管理起来很麻烦,甚至有时会遇到错误:

  • 每个DLL项目都有一个名为“Include”的文件夹
  • Console应用程序项目引用每个DLL项目的Include文件夹(如msdn指南中所建议的那样使用DLL)
  • 每个DLL项目都包含一个标题,其中包含该项目中的所有标题
  • 控制台应用程序然后#includes这些“主标题”
  • 每个项目都使用预编译的标题“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;

有了这个,我有时会得到一些不相关的随机编译器错误,我可以通过从“主标题”中排除标题并在控制台应用程序中单独包含麻烦制造者来解决问题。

建议什么可以做得更好?

2 个答案:

答案 0 :(得分:4)

__declspec(dllexport)__declspec(dllimport)定义应放在每个公共Dll包含文件中,或至少放在主Dll公共包含文件中,其中包含所有其他文件。这些定义不应该在stdafx.h

#define DLL // Found in every DLL, not in the console project

这是不正确的,每个Dll必须具有唯一的预处理器定义。在你的情况下,一个Dll依赖于另一个,它总是将另一个Dll函数编译为__declspec(dllexport)

确保每个标头的开头都有#pragma once

考虑对所有项目使用通用Include目录。

正如评论中已经提到的,using namespace只能在源文件中使用。

答案 1 :(得分:0)