2

将链接依赖项添加到 zlibwapi.lib 会导致我的所有单元测试失败,并显示消息“无法设置执行上下文以运行测试”。不幸的是,该消息没有提供足够的详细信息来解决问题。具体了解为什么无法设置测试执行上下文将非常有用,例如,由于 some_reason 无法加载 some.dll。

其他帖子已经指出所有依赖库必须在同一目录中,但这并不能解决我的问题。dumpbin.exe 工具清楚地表明,向 zlibwapi.lib 添加链接依赖项只会将 zlibwapi.dll 添加到导入部分。此外,zlibwapi.dll 的导入部分仅包含单元测试库的导入部分中已经存在的 KERNEL32.dll 和 MSVCR110D.dll。所有非标准依赖库都在单元测试运行时文件夹中,它仍然失败。

通过下载 zlib、在 Visual Studio 2012 SP3 中构建它并添加本机单元测试,可以重现该问题。具体来说:

  1. 从http://www.zlib.net下载 zlib128.zip 。

  2. 按照这些提示 ( http://bugbeebox.com/2012/12/29/building-static-zlib-v1-2-7-with-msvc-2012/ ) 在 Visual Studio 2012 上构建。

  3. 将名为 zlibunittest 的本机单元测试项目添加到 ...\zlib-1.2.8\contrib\vstudio\vc11。在 Build\Configuration Manager 中,为新项目添加一个 x64 位平台,确认它的 Build 复选框已选中,并为活动解决方案平台选择 x64。将项目依赖项从 zlibunittest 添加到 zlibvc 以确保正确的构建顺序也很有用。

  4. 修改 unittest1.cpp 的 TestMethod1 显示为:

    TEST_METHOD(TestMethod1)
    {
        Assert::AreEqual(0, 0);
    }
    

    将测试 --> 测试设置 --> 默认处理器架构设置为 x64 并验证它在测试资源管理器中正确运行。

  5. 修改 zlibunittest 配置属性如下:

    a) 添加..\..\..\..\;到 C/C++ --> General --> Additional Include Directories 所以可以找到 zlib.h。b) 添加 $(OutDir); 到链接器 --> 常规 --> 附加库目录,以便可以找到 zlibwapi.*。c) 添加zlibwapi.lib;链接器->输入->附加依赖项。d) 将副本 ..\x64\ZlibDllDebug\zlibwapi.* $(OutDir) 添加到 Build Events --> Pre-Build Event,以便 zlib 运行时库与单元测试库二进制文件位于同一目录中。

  6. 修改 unittest1.cpp 的 TestMethod1 显示为:

    TEST_METHOD(TestMethod1)
    {
        Assert::AreEqual(0, 0);
        gzopen(NULL, NULL);
    }
    

    gzopen 的 NULL 参数与此错误无关,因为它永远不会那么远。

  7. 在测试资源管理器中运行单元测试并获得一般错误“无法设置执行上下文以运行测试”。

  8. 现在,注释掉 TestMethod1 中的 gzopen 调用,并从附加的链接器依赖项中删除 zlibwapi.lib 并观察错误消失。

有谁知道如何使 ZLib 与 Visual Studio 2012 本机单元测试一起工作?

至少,有谁知道如何获取有关此特定错误的更多详细信息,即某处的单元测试运行时日志?

4

1 回答 1

0

事实证明,zlib 有一个错误,导致它需要 Windows 8 运行时。因此,显然在我的 Windows 7 开发机器上运行单元测试会导致神秘且不必要的神秘“无法设置执行上下文”错误。

一旦我将此修复https://stackoverflow.com/a/17113126/2319854应用到 zlib 并重建所有,单元测试再次开始工作。

于 2013-07-17T18:19:13.837 回答