我已经成功地使用以下命令从.PROTO文件生成缓冲区类:
$ protoc --cpp_out=%CD% addressbook.proto
这适用于生成缓冲类addressbook.pb.h
和addressbook.pb.cc
文件。
现在,当我编写一个使用这些缓冲区类的应用程序时,我会遇到链接器错误。我尝试了几种不同的方式:
与shipped example’s Makefile和在线文档中一样:
pkg-config --cflags protobuf
g++ myApplication.cc addressbook.pb.cc `pkg-config --cflags --libs protobuf`
<Fails with linker errors.>
此外,只需进入examples directory,然后:
make cpp
失败了,
c++ add_person.cc addressbook.pb.cc -o add_person_cpp `pkg-config --cflags --libs protobuf`
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: cannot find -lprotobuf
collect2.exe: error: ld returned 1 exit status
make: *** [add_person_cpp] Error 1
我确信pkg-config设置正确,因为:
$ pkg-config --cflags protobuf
-Isomepath/install/include
和
$ pkg-config --libs protobuf
-Lsomepath/install/lib/ -llibprotobuf
然后,按照建议here,我尝试了:
g++ -I somepath/install/include -L somepath/install/lib add_person.cc addressbook.pb.cc -lprotobuf
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: cannot find -lprotobuf
collect2.exe: error: ld returned 1 exit status
make: *** [cpp] Error 1
和
g++ -I somepath/install/include -L somepath/install/lib add_person.cc addressbook.pb.cc -llibprotobuf
Fails with linker errors.
…
C:\Users\usrname\AppData\Local\Temp\ccjC2zi3.o:add_person.cc:(.text+0x2bb): undefined reference to `google::protobuf::internal::VerifyVersion(int, int, char const*)'
C:\Users\usrname\AppData\Local\Temp\ccjC2zi3.o:add_person.cc:(.text+0x3b1): undefined reference to `google::protobuf::Message::ParseFromIstream(std::istream*)'
C:\Users\usrname\AppData\Local\Temp\ccjC2zi3.o:add_person.cc:(.text+0x475): undefined reference to `google::protobuf::Message::SerializeToOstream(std::ostream*) const'
C:\Users\usrname\AppData\Local\Temp\ccjC2zi3.o:add_person.cc:(.text+0x4cd): undefined reference to `google::protobuf::ShutdownProtobufLibrary()'
C:\Users\usrname\AppData\Local\Temp\ccjC2zi3.o:add_person.cc:(.text$_ZNK6google8protobuf5Arena9AllocHookEPKSt9type_infoj[__ZNK6google8protobuf5Arena9AllocHookEPKSt9type_infoj]+0x2e): undefined reference to `google::protobuf::Arena::OnArenaAllocation(std::type_info const*, unsigned int) const'
… [ a few hundred lines ]
我在执行
后重复了上面的例子set LD_LIBRARY_PATH=somepath\install\lib
我确保Window系统设置中的环境变量指向包含libprotobuf.lib的目录(为什么此lib文件夹中生成的pkgconfig文件夹包含protobuf.pc)包含以下行:
libdir=somepath/install/lib
Libs: -L${libdir} -lprotobuf
不应该
Libs: -L${libdir} -llibprotobuf
仍然在设置LD_LIBRARY_PATH后出现相同的错误。我尝试使用g ++ v4.9.2和v6.3.0以及MSVC 2013,2015,2017(使用cl而不是g ++)。
我尝试的另一件事是将libprotobuf.lib放在MiGW / bin中,想想也许g ++会找到它,但它没有帮助。
为什么g ++ / MSVC无法找到这些库或者我做错了什么?
nmake check
时通过的所有测试。答案 0 :(得分:1)
您是否为使用MSVC的Microsoft Windows构建了protobuf库?你不应该期望MinGW可以使用用MSVC构建的静态库。
为了在Microsoft Windows下链接您的示例,您可以写:
cl -I somepath\install\include somepath\install\lib\libprotobuf.lib add_person.cc addressbook.pb.cc
编译器'cl'看到文件类型'.lib'并将'libprotobuf.lib'作为库处理。