为使用 boost 的预开发库构建 C++ 包装器时未解决的外部问题

Unresolved externals when building c++ wrapper for a pre-developed library that uses boost

我在 C++ 中编写了一个使用 PCL 和 boost 的库。它正在完美地构建。当我尝试使用 C++/CLR 为它制作包装器时,我遇到了很多未解决的错误。 首先,为什么 Visual Studio 在构建包装器时再次重建我的库? 其次,为什么我得到以下未解决的错误?:

错误 LNK2005 "protected: virtual void __cdecl pcl::Grabber::signalsChanged(void)" (?signalsChanged@Grabber@pcl@@MEAAXXZ) 已在 pcl_io_debug.lib(pcl_io_debug.dll) 中定义
错误 LNK2005 "protected: virtual void __cdecl pcl::Grabber::signalsChanged(void)" (?signalsChanged@Grabber@pcl@@MEAAXXZ) 已在 pcl_io_debug.lib(pcl_io_debug.dll) 中定义
错误 LNK2001 未解析的外部符号 "public: virtual void __cdecl pcl::visualization::PCLVisualizer::FPSCallback::Execute(class vtkObject *,unsigned long,void *)" (?Execute@FPSCallback@PCLVisualizer@visualization@pcl@@UEAAXPEAVvtkObject@@KPEAX@Z)
错误 LNK2019 未解析的外部符号 deflate 在函数 "protected: int __cdecl boost::iostreams::detail::zlib_base::xdeflate(int)" 中引用 (?xdeflate@zlib_base@detail@iostreams@boost@@IEAAHH@Z)
错误 LNK2019 未解析的外部符号 deflateEnd 在函数 "protected: void __cdecl boost::iostreams::detail::zlib_base::reset(bool,bool)" 中引用 (?reset@zlib_base@detail@iostreams@boost@@IEAAX_N0@Z)
错误 LNK2019 未解析的外部符号 inflate 在函数 "protected: int __cdecl boost::iostreams::detail::zlib_base::xinflate(int)" 中引用 (?xinflate@zlib_base@detail@iostreams@boost@@IEAAHH@Z)
错误 LNK2019 未解析的外部符号 inflateEnd 在函数 "protected: void __cdecl boost::iostreams::detail::zlib_base::reset(bool,bool)" 中引用 (?reset@zlib_base@detail@iostreams@boost@@IEAAX_N0@Z)
错误 LNK2019 未解析的外部符号 deflateReset 在函数 "protected: void __cdecl boost::iostreams::detail::zlib_base::reset(bool,bool)" 中引用 (?reset@zlib_base@detail@iostreams@boost@@IEAAX_N0@Z)
错误 LNK2019 未解析的外部符号 inflateReset 在函数 "protected: void __cdecl boost::iostreams::detail::zlib_base::reset(bool,bool)" 中引用 (?reset@zlib_base@detail@iostreams@boost@@IEAAX_N0@Z)
Error LNK2019 unresolved external symbol crc32 referenced in function "protected: void __cdecl boost::iostreams::detail::zlib_base::after(char const * &,char * &,bool)" (?after@zlib_base@detail@iostreams@boost@@IEAAXAEAPEBDAEAPEAD_N@Z)
Error LNK2019 unresolved external symbol deflateInit2_ referenced in function "private: void __cdecl boost::iostreams::detail::zlib_base::do_init(struct boost::iostreams::zlib_params const &,bool,void * (__cdecl*)(void *,unsigned int,unsigned int),void (__cdecl*)(void *,void *),void *)" (?do_init@zlib_base@detail@iostreams@boost@@AEAAXAEBUzlib_params@34@_NP6APEAXPEAXII@ZP6AX22@Z2@Z )
Error LNK2019 unresolved external symbol inflateInit2_ referenced in function "private: void __cdecl boost::iostreams::detail::zlib_base::do_init(struct boost::iostreams::zlib_params const &,bool,void * (__cdecl*)(void *,unsigned int,unsigned int),void (__cdecl*)(void *,void *),void *)" (?do_init@zlib_base@detail@iostreams@boost@@AEAAXAEBUzlib_params@34@_NP6APEAXPEAXII@ZP6AX22@Z2@Z )

C++-CLI 是一种不同的语言;它编译到一个完全不同的目标(某些 .NET 运行时 version/architecture),这既是它再次构建的原因,也是您需要为这些目标配置配置 link 依赖项的原因。

我个人会将所有本机依赖项保留在本机 DLL 中,并在混合模式程序集中实现一个窄接口。这样您就可以将混合模式程序集的依赖项总结为捆绑任何其他本机依赖项的一个本机 DLL。

实际上我刚刚使用了 BOOST_IOSTREAMS_NO_LIB,这解决了大部分问题。 所以在我看来,windows 中的 bzip2 过滤器存在问题,因为它应该默认被禁用,而且大部分情况下都禁用它们。 对于与可视化工具相关的其他问题,我找到了答案