Boost.Test 的 vcpkg 端口无法 link

vcpkg port of Boost.Test fails to link

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

一切都编译正常,但一些项目使用 Boost.Test,更具体地说有 linker 错误,如:

boost_unit_test_framework-vc140-mt-gd.lib(boost_unit_test_framework-vc141-mt-gd-x32-1_73.dll) : error 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) already defined in 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) : error LNK2005: "public: virtual __thiscall boost::unit_test::lazy_ostream::~lazy_ostream(void)" (??1lazy_ostream@un it_test@boost@@UAE@XZ) already defined in AAA.obj [c:\src\AAA\AAA.vcxproj]

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

我也试过禁用自动link(BOOST_ALL_NO_LIB),强制动态库(BOOST_DYN_LINK),但没有任何效果。

有什么我遗漏的吗?

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

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

其余测试使用链接版本:

#include <boost/test/unit_test.hpp>

将 main 的头文件更改为 linked 副本使错误消失:

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

它在我们的 Boost 编译中工作正常,但很明显 vcpkg 不喜欢这种混合。