链接protobuf时未定义的引用

时间:2016-08-02 22:00:16

标签: c++ c++14 undefined-reference protocol-buffers

我正在使用Mac。我用brew install protobuf --c++11安装了libprotobuf。

17:51 $ brew info protobuf
protobuf: stable 2.6.1 (bottled), devel 3.0.0-beta-4, HEAD
Protocol buffers (Google's data interchange format)
https://github.com/google/protobuf/
/usr/local/Cellar/protobuf/2.6.1 (149 files, 7.0M) *
  Built from source on 2016-08-02 at 17:42:15 with: --c++11

libprotobuf.dylib住在/usr/local/Cellar/protobuf/2.6.1/lib

我编写了以下虚拟应用程序,希望调用this constructor

// test.cc
#include <string>
#include <google/protobuf/io/coded_stream.h>
#include <google/protobuf/io/zero_copy_stream_impl_lite.h>

int main() {
  std::string s{"hello"};
  google::protobuf::io::StringOutputStream sos(&s);
}

当我编译应用程序时,我收到一个未定义的引用错误:

17:55 $ g++ -L/usr/local/Cellar/protobuf/2.6.1/lib -std=c++14 test.cc -lprotobuf
Undefined symbols for architecture x86_64:
  "google::protobuf::io::StringOutputStream::StringOutputStream(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)", referenced from:
      _main in ccyQlDM5.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

当我检查.dylib StringOutputStream时,它有点不稳定。

17:56 $ nm /usr/local/Cellar/protobuf/2.6.1/lib/libprotobuf.dylib | c++filt | grep "StringOutputStream(std::"
000000000000e3ac T google::protobuf::io::StringOutputStream::StringOutputStream(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*)
000000000000e398 T google::protobuf::io::StringOutputStream::StringOutputStream(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*)

为什么在basic_string的符号列表中,::__1名称空间以[{1}}为前缀?我该如何解决这个问题?

如果这不是一个问题(可能是一个unmangling的工件),为什么我仍然收到一个对我知道定义的构造函数调用的未定义引用?

我正在使用.dylib来编译gcc 5.3.0

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,Homebrew正在构建brew而不是.dylib

我删除了由/usr/local/lib安装的protobuf,签出并构建了源代码,将新{{1}}复制到{{1}},它运行正常。