在Visual Studio 2005中重用对象文件

时间:2008-11-04 10:55:18

标签: c++ visual-studio-2005 visual-c++-2005

情况如下:

我有一个带有两个项目的VS2005解决方案:MyDll(DLL),MyDllUnitTest(控制台EXE)。

在MyDll中,我有一个名为MyClass的类,它是DLL的内部类,不应该导出。我想在MyDllUnitTest中测试它,所以我添加了一个名为MyClassTest的测试套件类,在那里我创建了MyClass的实例并测试它们。

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

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

编辑:我不想在两个项目中拥有相同的源文件 - 考虑我有很多MyClass / MyClassTest的面孔,这意味着我必须将每个MyClass复制到另一个项目。 我知道可以在两个项目中使用相同的目标文件,我之前已经看过它,但忘了怎么做。

编辑:我决定将文件放在两个项目中,因此它们会被编译两次。事实证明“参考”功能可以自动运行 - 但仅适用于静态lib项目。

5 个答案:

答案 0 :(得分:2)

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

如果你想在不导出类本身的情况下测试dll(我认为这是因为在dll中输出类通常是一个坏主意),考虑从dll导出“factory”函数。它会有一个签名:

extern "C" MyClass *CreateMyClass();

此函数将创建MyClass的对象并返回指向它的指针。然后,您的单元测试可以使用返回的类对象执行所需的任何操作。

答案 1 :(得分:1)

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

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

以下是要使用的属性的MSDN参考...

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

答案 2 :(得分:1)

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

我们这样做的一个原因是我们使用CMake生成我们的项目文件,因此无法使用所有内部Visual Studio'魔术'。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

你也可以尝试使用一个命令来生成包含所有对象的.lib。

喜欢以下答案:Visual C++ link generated objs from referenced project