ld.exe找不到Protobuf 3.4.0的-lprotobuf

时间:2017-11-14 22:14:59

标签: c++ protocol-buffers

我已经成功地使用以下命令从.PROTO文件生成缓冲区类:

$ protoc --cpp_out=%CD% addressbook.proto

这适用于生成缓冲类addressbook.pb.haddressbook.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无法找到这些库或者我做错了什么?

  • 我按照README的建议在安装后运行nmake check时通过的所有测试。
  • 我卸载并重新安装了v3.4.0和v3.5.0,两者都有相同的行为。

1 个答案:

答案 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'作为库处理。