【问题标题】:Can't compile example from google protocol buffers无法从谷歌协议缓冲区编译示例
【发布时间】:2012-05-11 08:29:06
【问题描述】:

我 grep 其他主题,但他们不帮助我 =(。 在我的工作服务器上,我没有 sudo 权限,所以我安装了 PB

./configure --prefix=/home/username/local

然后我使用“person”示例创建源文件并使用 protoc 成功编译它。

我没有 pkg​​-info =(。我尝试用它编译它

g++ -I /home/username/local/include -L /home/username/local/lib -lprotobuf -lpthread main.cpp person.pb.cc

然后有十亿个模拟错误,即

person.pb.cc:(.text+0x4cf): 未定义的引用 `google::protobuf::internal::kEmptyString'

我认为,这是链接的问题,但是如何解决呢?

回显 $LD_LIBRARY_PATH /home/username/local/lib

在 main.cpp 中:

#include "person.pb.h"
...

谢谢。

【问题讨论】:

    标签: c++ linux compiler-errors g++ protocol-buffers


    【解决方案1】:

    把库放在最后:

    g++ -I /home/username/local/include -L /home/username/local/lib main.cpp person.pb.cc -lprotobuf -pthread

    来自GCC Link Options

    -图书馆 -l 库 链接时搜索名为 library 的库。 (将库作为单独参数的第二种选择 仅用于 POSIX 合规性,不推荐使用。) 在命令中编写此选项的位置有所不同; 链接器在 它们被指定的顺序。 因此,`foo.o -lz bar.o' 在文件 foo.o 之后搜索库 `z' 但是 bar.o 之前如果 bar.o 引用 `z' 中的函数,那些函数 可能无法加载。

    另外,使用-pthread 而不是-lpthread,因为-pthread 可能会为预处理器和链接器设置标志。

    【讨论】:

    • 你真的为我节省了很多时间!谢谢!
    【解决方案2】:

    库链接标志位于编译器参数的末尾:

    g++ -I /home/username/local/include -L /home/username/local/lib main.cpp person.pb.cc -lprotobuf -lpthread

    【讨论】:

      【解决方案3】:

      还有一个非常普遍的问题,它不仅适用于链接 protobuf,也适用于其他库。由于这是我的问题,我将解决方案放在这里,也许有人觉得它有用。

      确保您尝试链接到具有相同 ABI 的库。 C++ ABI 在 GCC 4.7.0 中发生了变化。因此,您不能将使用 GCC4.7.0 编译的库链接。

      可以通过植物链接抱怨 std::basic_string 和 std::list 来识别该问题,因为这是 C++ 中最突出的 ABI 更改。我的链接器尖叫看起来像这样:

          /bincrafters/stable/package/c0c1ef10e3d0ded44179e28b669d6aed0277ca6a/lib  -L/home/adam/.conan/data/libpcap/1.8.1/bincrafters/stable/package/0a813c597d519ec14c71192b99d7de0a92bbc1c3/lib  -L/home/adam/.conan/data/zmq/4.2.2/bincrafters/stable/package/0144a3b0aceb8edb5e63295c432a8de8020ab1b7/lib  -L/home/adam/.conan/data/libsodium/1.0.16/bincrafters/stable/package/db2ca884c9793e0b0fb54ec3f846326d1addacc8/lib -Wl,-rpath,/hoar, std::char_traits<char>, std::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)'
      CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o: In function `tutorial::Person_PhoneNumber::InternalSerializeWithCachedSizesToArray(unsigned char*) const':
      /home/adam/.conan/data/protobuf/3.9.1/bincrafters/stable/package/053ea29eb0edc6b1695c893b738a971110c756fd/include/google/protobuf/wire_format_lite.h:1673: undefined reference to `google::protobuf::io::CodedOutputStream::WriteStringWithSizeToArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned char*)'
      /home/adam/.conan/data/protobuf/3.9.1/bincrafters/stable/package/053ea29eb0edc6b1695c893b738a971110c756fd/include/google/protobuf/wire_format_lite.h:1673: undefined reference to `google::protobuf::io::CodedOutputStream::WriteStringWithSizeToArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned char*)'
      CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o: In function `google::protobuf::internal::GetEmptyStringAlreadyInited[abi:cxx11]()':
      /home/adam/.conan/data/protobuf/3.9.1/bincrafters/stable/package/053ea29eb0edc6b1695c893b738a971110c756fd/include/google/protobuf/message_lite.h:153: undefined reference to `google::protobuf::internal::fixed_address_empty_string[abi:cxx11]'
      CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o: In function `google::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)':
      /home/adam/.conan/data/protobuf/3.9.1/bincrafters/stable/package/053ea29eb0edc6b1695c893b738a971110c756fd/include/google/protobuf/wire_format_lite.h:880: undefined reference to `google::protobuf::internal::WireFormatLite::ReadBytes(google::protobuf::io::CodedInputStream*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)'
      CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o:(.data.rel.ro._ZTVN8tutorial11AddressBookE[_ZTVN8tutorial11AddressBookE]+0x20): undefined reference to `google::protobuf::Message::GetTypeName[abi:cxx11]() const'
      CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o:(.data.rel.ro._ZTVN8tutorial11AddressBookE[_ZTVN8tutorial11AddressBookE]+0x58): undefined reference to `google::protobuf::Message::InitializationErrorString[abi:cxx11]() const'
      CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o:(.data.rel.ro._ZTVN8tutorial6PersonE[_ZTVN8tutorial6PersonE]+0x20): undefined reference to `google::protobuf::Message::GetTypeName[abi:cxx11]() const'
      CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o:(.data.rel.ro._ZTVN8tutorial6PersonE[_ZTVN8tutorial6PersonE]+0x58): undefined reference to `google::protobuf::Message::InitializationErrorString[abi:cxx11]() const'
      CMakeFiles/NetworkMonitor.dir/addressbook.pb.cc.o:(.data.rel.ro._ZTVN8tutorial18Person_PhoneNumberE[_ZTVN8tutorial18Person_PhoneNumberE]+0x20): undefined reference to `google::protobuf::Message::GetTypeName[abi:cxx11]() const'
      make[2]: *** [bin/N
      

      在我为柯南定义配置文件并链接到使用相同版本的 C++ ABI 编译的库后,问题就消失了。

      【讨论】:

      • 能否提供详细信息。你在哪里设置 GCC ABI?你把它设置成什么?您如何知道将其设置为的正确值?
      • 编译器 GCC>4.7.0 中引入了与 C++11 标准相关的 C++ ABI 更改。 ABI 未设置,但它是 libstd 库的一部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      相关资源
      最近更新 更多