在Visual Studio 2005中重用对象文件
Reusing object files in Visual Studio 2005
情况如下:
我有一个带有两个项目的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
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在h文件中包含.o对象文件
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 从对象文件(.o)在macos上制作归档文件(.a文件)
- 检测 COFF 对象文件中C++内联符号
- 特定对象文件的单线程生成
- 使用对象文件读取三角形数据网格
- 链接时,不同静态库中的同一对象文件
- 防止临时对象文件访问 MSVC 中的磁盘
- 对在不同二进制文件中创建的对象文件的依赖关系
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)
- ./main:加载共享库时出错:libopencv_highgui.so.4.0:无法打开共享对象文件:没有这样的文件或
- 使用 make 将对象文件放在特定目录中
- 如何从 3d 对象文件中获取 3d 坐标
- 为什么我的生成文件没有生成对象文件?
- 如何在OSX上正确创建C++对象文件(.o)
- sf::Windows上的音乐:api-ms-win-crt-locale-l1-1-0.dll:无法打开共享对象文件
- 使用nvcc(CUDA-RINSIDE)正确链接对象文件
- 链接节点本机模块中的提升库,对象文件需要替代库版本