【问题标题】:Boost.Test crashes with ***Exception: Other on MSVCBoost.Test 崩溃并出现 ***Exception: Other on MSVC
【发布时间】:2018-04-20 11:50:48
【问题描述】:

我正在尝试在 Microsoft Visual Studio 14 2015(在 AppVeyor 上)中使用 Boost.Test 构建和运行测试。我的测试用例是这样定义的,所以它应该总是通过并且永远不会抛出:

#define BOOST_TEST_MODULE target_boost_test
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(testcase)
{
    BOOST_CHECK(true);
}

在 CMake 脚本中,我为测试设置了链接:

find_package(Boost REQUIRED COMPONENTS unit_test_framework)
include_directories(${Boost_INCLUDE_DIRS})
...
add_executable(${UT_TARGET} ${UT_SOURCE})
target_link_libraries(${UT_TARGET} ${LIBRARIES} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})

测试编译正常,没有任何警告,但没有运行并且失败,***Exception: Other 非常不清楚。

Test project C:/projects/msvc-boost-test/build
    Start 1: target_boost_test
1/1 Test #1: target_boost_test ................***Exception: Other  0.08 sec

为了轻松重现,我在 GitHub 上设置了一个包含所有必要文件的存储库,并在 AppVeyor 上设置了一个自动构建作业来显示问题。

【问题讨论】:

  • 可能是在构建时与运行时使用了不一致的 DLL 版本。你能检查一下吗?依赖查看器?在 linux 上,没有问题:i.imgur.com/WTNpaBg.png
  • @sehe 非常感谢您的调查。我在 Linux 上也没有遇到问题。不幸的是,我什至没有 Windows 机器,只想使用 AppVeyor 构建我的跨平台项目。我将尝试导出构建工件并在 Linux 上对其进行检查。
  • 为什么必须在 wine 中运行它?你的意思是你没有访问测试机?这将使重现问题变得更加困难。或许可以在 供您使用的 Windows 系统上提升构建工件并手动运行测试
  • 显然 CMake 配方已经在 linux 上为我做到了(我通常在 linux 上手动完成)。因此,您可以合理地期望它也可以在 MSVC 上运行,但可能涉及到不同的 CMake 模式。 (在 Visual Studio 中,只需制作库依赖项就足以将它们复制到输出目录 AFAIR)

标签: c++ unit-testing visual-c++ boost cmake


【解决方案1】:

[非常感谢 @sehe 让我走上正轨]


在这种情况下,异常是由未找到 Boost.Test DLL 引起的。我对 Windows 太不熟悉了,不知道为什么动态链接器无法自动找到 DLL。到目前为止,我已经为这种情况找到了两种解决方法/修复方法。第一种是我的首选方式。

1。将DLL路径添加到PATH

对于我的 AppVeyor YAML 配置,它看起来像这样:

environment:
  BOOST_LIBRARYDIR: "C:\\Libraries\\boost_1_59_0\\lib64-msvc-14.0"
  PATH: "%BOOST_LIBRARYDIR%;%PATH%"

2。将DLL复制到同一目录

显然动态链接器总是搜索工作目录(或可执行文件的目录?我不知道)。复制 DLL 也可以,在我的 AppVeyor YAML 配置中,它看起来像这样:

after_build:
  - cmd: copy "%BOOST_LIBRARYDIR%\boost_unit_test_framework-vc140-mt-gd-1_59.dll" .

这是不太通用的解决方案,因为它需要明确指定 DLL 的名称。因此,当从调试模式切换到发布模式时,还必须调整 DLL 名称。


问题中的 repo 内容在工作版本中总结在 this Gist 中。

【讨论】:

  • 最简单的解决方案是通过包含 &lt;boost/test/included/unit_test.hpp&gt; 将 boost 测试用作仅标头库。
  • @VTT 感谢您的意见。对于 Boost.Test 来说,这确实是一种正确且明智的方法,但其他 Boost 库可能不存在仅头文件,并且会导致相同的问题。
猜你喜欢
  • 2020-12-02
  • 2019-08-01
  • 2013-01-23
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 2017-11-09
相关资源
最近更新 更多