【问题标题】:Reusing object files in Visual Studio 2005在 Visual Studio 2005 中重用目标文件
【发布时间】:2008-11-04 10:55:18
【问题描述】:

情况如下:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    extern "C" MyClass *CreateMyClass();
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多