2

情况如下:

我有一个带有两个项目的 VS2005 解决方案:MyDll (DLL)、MyDllUnitTest (console EXE)。

在 MyDll 中,我有一个名为 MyClass 的类,它位于 DLL 内部,不应导出。我想在 MyDllUnitTest 中对其进行测试,所以我添加了一个名为 MyClassTest 的测试套件类,我在其中创建了 MyClass 的实例并对其进行测试。

我的问题:如何将通过构建 MyDll 创建的 MyClass 的目标文件链接到 MyDllUnitTest EXE?我不想在 MyDllUnitTest 中构建 MyClass,也不想导出该类。

我尝试对两个项目使用相同的中间目录(因此目标文件位于同一目录中)并使用 VS2005 的引用功能(右键单击项目 --> 引用 --> 添加新引用...),但它没有t 工作 - 我仍然收到链接错误(LNK2001)。

编辑:我不想在两个项目中拥有相同的源文件 - 考虑到我有很多 MyClass/MyClassTest,这意味着我必须将每个 MyClass 复制到不同的项目中。我知道可以在两个项目中使用相同的目标文件,我以前见过它,但忘记了如何。

编辑:我决定将文件放在两个项目中,所以它们被编译了两次。事实证明,“参考”功能自动工作 - 但仅适用于静态库项目。

4

5 回答 5

2

我不明白你为什么不想在你的 dll 项目中构建它。只要两个项目都使用相同的源文件,它们就会生成相同的目标文件(假设编译器选项的设置方式相同)。

如果您想在不导出类本身的情况下测试 dll(我认为这是因为在 dll 中导出类通常不是一个好主意),请考虑从 dll 中导出“工厂”函数。它将具有如下签名:

extern "C" MyClass *CreateMyClass();

这个函数将创建一个 MyClass 对象并返回一个指向它的指针。然后,您的单元测试可以对返回的类对象做任何需要的事情。

于 2008-11-04T11:28:50.847 回答
1

这是实现您尝试做的事情的另一种方法,但我相信它会满足您的要求...

在包含要测试的类的程序集上使用 InternalsVisibleToAttribute 属性。然后,如果您引用此程序集,您将能够测试该类,即使对于其他程序集这些类型是“不可见的”。魔法!

这是要使用的属性的 MSDN 参考...

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

于 2008-11-04T22:19:28.663 回答
1

我在这里所做的是在测试项目中制作一个额外的“过滤器”“对象文件”,以及“头文件”和“源文件”,并将所有必要的 .obj 文件放在那里(如果他们已经顺便说一句,已经生成了)。这似乎在这里工作正常。我们在这里也使用它进行单元测试,并且在某些地方,在将相同的源文件用于两个不同的 DLL 时不必编译两次。

我们这样做的一个原因是我们使用 CMake 来生成我们的项目文件,因此不能使用所有内部 Visual Studio 的“魔法”。

于 2012-08-06T15:47:47.807 回答
0

我认为您还需要将 .obj 文件显式添加到项目链接器设置中的其他依赖项列表中。

于 2008-11-04T12:21:25.453 回答
0

您还可以尝试使用生成包含所有对象的 .lib 的命令。

就像来自的答案一样:Visual C++ link generated objs from referenced project

于 2011-12-17T01:36:08.167 回答