在XCode中链接协议缓冲库

时间:2013-08-03 13:42:45

标签: xcode linker protocol-buffers

我想在XCode中使用Google Protocol Buffers for C ++ 这是我拥有库的目录:/Developer/Protobuf

我在此目录中所做的是编译.proto并生成.pb.h& 。pb.cc个文件。在此之后产生了目标文件:

clang++ -arch x86_64 -I./src -I./  -c file.pb.cc

然后:

ar -r file.pb.a file.pb.o

在XCode中,Build Phases -> Link Binary With Libraries我添加了file.pb.a静态库。在Build Settings -> Header Search Paths我添加了/Developer/Protobuf/src。在Build Settings -> Librabry Search Paths我添加了/Developer/Protobuf。在Build Settings -> User Header Search Paths我添加了/Developer/Protobuf/src

但是当我编译项目时,我总是遇到这种错误:

Undefined symbols for architecture x86_64:
  "google::protobuf::DescriptorPool::generated_pool()", referenced from:
      musicbrainz::protobuf_AssignDesc_musicbrainz_2eproto() in musicbrainz.pb.o
  "google::protobuf::DescriptorPool::InternalAddGeneratedFile(void const*, int)", referenced from:
      musicbrainz::protobuf_AddDesc_musicbrainz_2eproto() in musicbrainz.pb.o
  "google::protobuf::MessageFactory::generated_factory()", referenced from:
      musicbrainz::protobuf_AssignDesc_musicbrainz_2eproto() in musicbrainz.pb.o
  "google::protobuf::MessageFactory::InternalRegisterGeneratedFile(char const*, void (*)(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&))", referenced from:
      musicbrainz::protobuf_AddDesc_musicbrainz_2eproto() in musicbrainz.pb.o
.................................................................................

也许我没有正确创建静态库?

1 个答案:

答案 0 :(得分:2)

首先,您需要使用其makefile编译Protocol Buffers静态库,然后将静态库链接到您的项目中。你不应该将他们的源代码插入你的Xcode项目。

将库链接到我的项目时,我遇到了与您相同的“未定义符号”错误。基于注释#19 in this discussion,在构建协议缓冲区库时运行以下命令将使它们消失。

$ ./configure CC=clang CXX="clang++ -std=c++11 -stdlib=libc++" CXXFLAGS="-O3" --disable-shared
$ make