Boost.Test 的 vcpkg 端口链接失败

vcpkg port of Boost.Test fails to link

提问人:cbuchart 提问时间:9/30/2020 更新时间:9/30/2020 访问量:337

问:

我们刚刚从我们自己的 Boost 编译切换到 vcpkg 的编译 (1.73.0),并自动将 vcpkg 与 Visual Studio 集成。我们没有使用 CMake。

一切都编译得很好,但一些使用 Boost.Test 的项目,更具体地说是链接器错误,例如:

boost_unit_test_framework-vc140-mt-gd.lib(boost_unit_test_framework-vc141-mt-gd-x32-1_73.dll) : 错误 LNK2005: “public: static class boost::unit_test::unit_test_log_t & __cdecl boost::unit_test::unit_test_log_t: :instance(void)” (?instance@unit_test_log_t@unit_test@boost@@SAAAV123@XZ) 已在 AAA.obj [c:\src\AAA\AAA.vcxproj] 中定义

boost_unit_test_framework-vc140-mt-gd.lib(boost_unit_test_framework-vc141-mt-gd-x32-1_73.dll) : 错误 LNK2005: “public: virtual __thiscall boost::unit_test::lazy_ostream::~lazy_ostream(void)” (??1lazy_ostream@un it_test@boost@@UAE@XZ) 已在 AAA.obj [c:\src\AAA\AAA.vcxproj] 中定义

我已经检查了几个问题和其他问题报告(比如这个),但所有描述似乎都没问题:

  • 正确的三元组 (x86-windows)
  • 一切都是动态的
  • 正确的运行时版本(用于发布的多线程 DLL,用于调试的多线程调试 DLL)
  • 没有手动链接的文件

我还尝试过禁用自动链接(),强制动态库(),但没有任何效果。BOOST_ALL_NO_LIBBOOST_DYN_LINK

我错过了什么吗?

C++ 提升 链接器错误 vcpkg

评论


答:

2赞 cbuchart 9/30/2020 #1

在我意识到一些使用 Boost.Test 的项目编译成功后,我开始将它们与失败的项目进行比较,并发现了问题的根源:定义测试应用程序主文件的文件使用的是包含的框架版本:

#define BOOST_TEST_MAIN
#include <boost/test/included/unit_test.hpp>

而其余测试则使用链接版本:

#include <boost/test/unit_test.hpp>

将 main 的头文件更改为链接的对应文件会使错误消失:

#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>

它与我们的 Boost 编译配合正常,但很明显 vcpkg 不喜欢这种混合。