Visual Studio protobuf的vcpkg版本未定义FatalException

e0bqpujr  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(196)

我的VS项目使用protobuf,它是通过vcpkg的系统级集成特性访问的。

1>...: error LNK2001: unresolved external symbol "public: virtual char const * __cdecl google::protobuf::FatalException::what(void)const " (?what@FatalException@protobuf@google@@UEBAPEBDXZ)
1>...: error LNK2001: unresolved external symbol "public: virtual __cdecl google::protobuf::FatalException::~FatalException(void)" (??1FatalException@protobuf@google@@UEAA@XZ)

问题似乎是PROTOBUF_USE_EXCEPTIONS分别用于在protobuf库common.h和www.example.com中有条件地声明和定义这些函数common.cc。PROTOBUF_USE_EXCEPTIONS是在我的项目中定义的(似乎是我的项目的默认值),因此标头声明了这些函数。但是,当vcpkg构建protobuf时,可能没有定义它,因此没有定义这些函数。
如何在vcpkg构建protobuf时定义PROTOBUF_USE_EXCEPTIONS?
我正在使用VS 2022预览版4.1,协议缓冲区3.18.0,和vcpkg(2021-09-10- 2059 ef 11 aa 6067 e6 f59 b 0 d939 c5 d17 e3 c5 c47 d3 e)

pokxtpni

pokxtpni1#

这不是让vcpkg用PROTOBUF_USE_EXCEPTIONS构建protobuf的答案,但我最近在VS、protobuf和vcpkg中遇到了这个问题,它占用了我相当多的时间。我的解决方案与用PROTOBUF_USE_EXCEPTIONS构建protobuf不同,但希望这些信息仍然可以帮助一些人。
在我的例子中,我在移植一个现有的C项目以使用C20模块和模块头单元时遇到了这个问题。当在源文件中正常地包含protobuf头时,不会发生任何问题,但是当protobuf头被放入模块头单元时,这个问题会莫名其妙地出现,不管是什么原因。
我尝试了几种方法,包括取消定义PROTOBUF_USE_EXCEPTIONS,以及在头单元和源文件中手动将其定义为0。最后,唯一有效的方法是在Visual Studio中的模块头单元项目上,将PROTOBUF_USE_EXCEPTIONS=0设置在Project PropertiesConfiguration PropertiesC/C++PreprocessorPreprocessor Definitions下。
这终于让这个问题消失了。

相关问题