在Visual Studio 2005中重用对象文件

Reusing object files in Visual Studio 2005

本文关键字:对象 文件 Visual Studio 2005      更新时间:2023-10-16

情况如下:

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

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

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

我尝试对两个项目使用相同的中间目录(因此对象文件在同一目录中),并使用VS2005的引用功能(右键单击项目-->References-->添加新引用…),但没有成功-我仍然收到链接错误(LNK2001)。

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

编辑:我决定把文件放在两个项目中,所以它们被编译了两次。事实证明,"引用"功能是自动工作的,但仅适用于静态lib项目。

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

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

extern "C" MyClass *CreateMyClass();

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

这里有一种替代方法来实现您想要做的事情,但我相信它会满足您的要求。。。

对包含要测试的类的程序集使用InternalsVisibleToAttribute特性。然后,如果引用此程序集,则可以测试该类,即使对于其他程序集,这些类型是"不可见的"。魔术

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

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

我在这里所做的是在测试项目中制作一个额外的"filter"Object Files",以及"Header Files"answers"Source Files",并将所有必要的.obj文件放在那里(顺便说一句,如果它们已经生成,这会更容易)。这在这里似乎很管用。我们在这里也将其用于单元测试,在某些地方,当将同一源文件用于两个不同的DLL时,不必对其进行两次编译。

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

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

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

类似于中的答案:Visual C++链接从引用的项目生成obj