我正在尝试使用Microsoft Visual Studio 14 2015中的Boost.Test构建并运行测试(在AppVeyor上)。我的测试用例是这样定义的,因此它应该始终通过并且永远不会抛出:
#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上的自动构建作业来显示问题。
答案 0 :(得分:1)
[非常感谢@sehe让我走上正轨]
在这种情况下,异常是由未找到Boost.Test DLL引起的。我对Windows太熟悉,不知道为什么动态链接器无法自动找到DLL。到目前为止,我已经找到了两种针对这种情况的解决方法/修复方法。第一个是我喜欢的方式。
如果是我的AppVeyor YAML配置,它看起来像这样:
after_build:
- cmd: copy "%BOOST_LIBRARYDIR%\boost_unit_test_framework-vc140-mt-gd-1_59.dll" .
显然,动态链接器总是搜索工作目录(或可执行文件的目录?我不知道)。复制DLL也工作了,再次在我的AppVeyor YAML配置中,这看起来像这样:
_.keys()
这是不太通用的解决方案,因为它需要显式指定DLL的名称。因此,当从调试模式切换到释放模式时,还必须调整DLL名称。
问题中的回购内容在工作版本的this Gist中进行了总结。