提问人:cbuchart 提问时间:9/30/2020 更新时间:9/30/2020 访问量:337
Boost.Test 的 vcpkg 端口链接失败
vcpkg port of Boost.Test fails to link
问:
我们刚刚从我们自己的 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_LIB
BOOST_DYN_LINK
我错过了什么吗?
答:
在我意识到一些使用 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 不喜欢这种混合。
评论