1

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

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

  • 每个 DLL 项目都有一个名为“Include”的文件夹
  • 控制台应用程序项目引用每个 DLL 项目的 Include 文件夹(如 msdn guide to working with DLLs 所建议的)
  • 每个 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;

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

建议有什么可以做得更好的?

4

2 回答 2

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只能在源文件中使用。

于 2013-03-12T13:33:20.133 回答
0

这篇文章回答了我的很多问题。

http://www.codeproject.com/Articles/6351/Regular-DLL-Tutor-For-Beginners

于 2013-03-12T14:12:11.023 回答