ld.exe找不到Protobuf 3.4.0的-lprotobuf



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

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

这将工作并生成缓冲区类addressbook.pb.haddressbook.pb.cc文件。

现在,当我编写一个使用这些缓冲区类的应用程序时,会出现链接器错误。我尝试了几种不同的方法:

如发货示例的Makefile和在线文档中所示:

pkg-config --cflags protobuf
g++ myApplication.cc addressbook.pb.cc `pkg-config --cflags --libs protobuf`
<Fails with linker errors.>

此外,只需进入examples目录,然后:

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配置设置正确,因为:

$ pkg-config --cflags protobuf
-Isomepath/install/include

而且,

$ pkg-config --libs protobuf
-Lsomepath/install/lib/ -llibprotobuf

然后,正如这里所建议的,我尝试了:

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:UsersusrnameAppDataLocalTempccjC2zi3.o:add_person.cc:(.text+0x2bb): undefined reference to `google::protobuf::internal::VerifyVersion(int, int, char const*)'
C:UsersusrnameAppDataLocalTempccjC2zi3.o:add_person.cc:(.text+0x3b1): undefined reference to `google::protobuf::Message::ParseFromIstream(std::istream*)'
C:UsersusrnameAppDataLocalTempccjC2zi3.o:add_person.cc:(.text+0x475): undefined reference to `google::protobuf::Message::SerializeToOstream(std::ostream*) const'
C:UsersusrnameAppDataLocalTempccjC2zi3.o:add_person.cc:(.text+0x4cd): undefined reference to `google::protobuf::ShutdownProtobufLibrary()'
C:UsersusrnameAppDataLocalTempccjC2zi3.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=somepathinstalllib

我确保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,两者都有相同的行为

您是否使用MSVC为Microsoft Windows构建了protobuf库?您不应该期望,MinGW将使用MSVC构建的静态库。

为了将你的例子链接到Microsoft Windows下,你可以写:

cl   -I somepathinstallinclude   somepathinstallliblibprotobuf.lib   add_person.cc   addressbook.pb.cc

编译器"cl"看到文件类型".lib",并将"libprotobuf.lib"作为库处理。

最新更新