链接 protobuf 时未定义的引用
Undefined reference when linking protobuf
我正在研究 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
当我为 StringOutputStream
检查 .dylib
时,它有点不稳定。
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
名称空间在我的 .dylib
符号列表中以 ::__1
为前缀?我该如何解决这个问题?
如果这不是问题(可能是 unmangling 的产物),为什么我仍然收到对我知道要定义的构造函数调用的未定义引用?
我正在使用 gcc 5.3.0
编译 test.cc
。
如评论中所述,Homebrew 使用 clang
而不是 g++
进行构建。
我删除了 brew
安装的 protobuf,检查并构建了源代码,将新的 .dylib
复制到 /usr/local/lib
,它工作正常。
我正在研究 Mac。我用 brew install protobuf --c++11
.
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
当我为 StringOutputStream
检查 .dylib
时,它有点不稳定。
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
名称空间在我的 .dylib
符号列表中以 ::__1
为前缀?我该如何解决这个问题?
如果这不是问题(可能是 unmangling 的产物),为什么我仍然收到对我知道要定义的构造函数调用的未定义引用?
我正在使用 gcc 5.3.0
编译 test.cc
。
如评论中所述,Homebrew 使用 clang
而不是 g++
进行构建。
我删除了 brew
安装的 protobuf,检查并构建了源代码,将新的 .dylib
复制到 /usr/local/lib
,它工作正常。