2

我目前正在用 C++(MSVS 2008)创建我自己的框架,它导出一个带有一堆函数的 dll,供我的框架的用户使用/调用。一开始,当我的项目还很小的时候,一切都很好。我编译了我的项目。吐出了一个 MyFramework.dll 和 MyFramework.lib。我冒充用户;将 MyFramework.dll 文件放在我的新 VS 项目的 Debug 文件夹中,将 MyFramework.lib 和 MyFramework.h 文件放在我的项目文件夹中,#include-d MyFramework.h 在我的代码中,瞧,我可以调用(仍然很简单)我的新项目中的框架功能。

但现在我已经扩展了我的框架。它现在使用自己的外部 dll(我称之为 Graphics.dll)并以相同的方式包含它(Debug 文件夹中的 .dll,项目文件夹中的 .lib/.h,代码中的 #include Graphics.h)。

问题是,当我现在创建 MyFramework.dll/MyFramework.lib,将其包含在我的新项目中并构建时,链接器抱怨无法包含 Graphics.h,它显然包含在 MyFramework.dll 的某个地方。

所以我的问题。我希望 MyFramework.dll 的用户只需要在他们的项目中包含 MyFramework.* 文件,而不需要复制/粘贴我决定在 MyFramework 中使用的所有外部库。我怎样才能做到这一点?我看了看这个线程。它说明了添加现有项目并按下“添加”按钮旁边的小箭头,但是......箭头在我的 MSVS 版本中不存在......

非常感谢您的帮助。

亲切的问候 W. Spek

4

3 回答 3

2

正在发生的事情是用户包含了您的库的头文件之一。然后该文件包含“graphics.h”。如果您不想要求您的用户有权访问此文件,则必须将其从库界面中隐藏。

那就是你的库必须有公共的api头文件和私有的实现头文件。您的用户仅包括公共 api 头文件,这些不包括任何 3rd 方或私有包含文件。当这些文件引用私有类型或第 3 方类型时,它们只能使用指针或引用,这些都是前向声明的。这使类的私有部分能够使用私有库代码和第 3 方类型。

使用Pimpl Idiom的机会可能会为您解决这个问题。

于 2009-10-15T13:14:00.263 回答
1

“问题是,当我现在创建 MyFramework.dll/MyFramework.lib,将其包含在我的新项目中并构建时,链接器抱怨无法包含 Graphics.h,它显然包含在 MyFramework.dll 的某个地方。”

你把头文件的路径放了吗?编译器报告头文件与正在转换的 cpp 文件不在同一目录中,并且它也未在其他包含目录中列出。

转到项目-> 属性,然后选择 C/C++

您将看到的第一个选项是“其他包含目录”。您需要将标题 Graphics.h 的路径以及所有其他需要用分号分隔的路径放在其中。我在 mo 打开的项目有,例如:“../AudioLibrary;../CoreLibrary;”

编辑:从您对 Mark 帖子的评论中,您说您想将 Graphics.DLL 嵌入到您的 DLL 中。我的回答如下:

如果您没有 Graphics.dll 的源代码,那么您就有问题了。你问的是可能的,但做起来很复杂。基本上你不能使用 LoadLibrary。您将被迫为 LoadLibaray 和 GetProcAddress 编写自己的代码,它们将查看嵌入式 DLL,而不是尝试在磁盘上找到它......它是可行的,但您需要在可移植可执行文件上进行大量阅读( PE) 文件结构

于 2009-10-15T10:22:12.000 回答
0

如果您不想要求用户拥有或包含 Graphics.h,则一种解决方法是使用LoadLibrary在运行时动态加载 Graphics.dll。

这意味着用户将能够在没有 Graphics.dll 可用的情况下针对 MyFramework 进行编译,因此如果 LoadLibrary 失败,进行某种错误报告可能是明智之举。

成功调用LoadLibraryGraphics.dll 后,您需要手动导入每个函数(及其签名)GetProcAddress-- 这实际上会为您提供函数指针。如何存储函数指针取决于您;我通常更喜欢在导入的函数周围包装一个类,但没有什么能阻止你将函数指针保持在全局范围内。


正如评论中提到的,如果您根本不想分发Graphics.dll,它需要是一个静态库(即“内置”到 MyFramework.dll)。如果您确实想要分发 Graphics.dll(这样用户可以在没有 MyFramework.dll 的情况下使用 Graphics.dll),那么上述方法仍然是更好的选择。确实,上述方法假设您使用 MyFramework.dll 分发 Graphics.dll,但用户可能不一定有可用的 Graphics.h。

于 2009-10-15T10:57:18.857 回答