问题描述
我们已经从自己的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:“公共:静态类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:“公共:虚拟__thiscall boost :: unit_test :: lazy_ostream ::〜lazy_ostream(void) ”(已在AAA.obj [c:\ src \ AAA \ AAA.vcxproj]中定义的(?? 1lazy_ostream @ un it_test @ boost @@ UAE @ XZ)
我已经检查了几个问题和其他问题报告(如this one),但所有描述都似乎还可以:
我还尝试禁用自动链接(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>
将主文件的头文件更改为与链接的对应的文件,使错误消失:
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
在我们的Boost编译中它可以正常工作,但是显然vcpkg不喜欢这种混合方式。