You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++项目使用Homebrew安装的Protobuf编译链接时Abseil相关符号未定义的问题求助

C++项目使用Homebrew安装的Protobuf编译链接时Abseil相关符号未定义的问题求助

我正在尝试在自己的应用中使用Protobuf,现在需要完成链接步骤来运行程序。

已执行的操作步骤

  1. 通过Homebrew安装Protobuf:
    brew install protobuf
    
  2. 检查Abseil是否已安装(因为遇到了相关错误):
    brew list --versions abseil
    
  3. 更新了链接器命令,使用的编译命令如下:
    /usr/bin/g++ -std=c++17 -fdiagnostics-color=always -I/Users/me/dev/customDev/cpp/tiny_db/generated -g /Users/me/dev/customDev/cpp/tiny_db/include/tiny_db.pb.cc /Users/me/dev/customDev/cpp/tiny_db/main.cpp -o /Users/me/dev/customDev/cpp/tiny_db/main -lprotobuf
    
  4. 编译proto文件:
    protoc --cpp_out=./include tiny_db.proto
    
  5. 在main.cpp中引入了生成的头文件,代码片段如下:
    #include <iostream>
    #include <unordered_map>
    #include <vector>
    #include <stdexcept>
    #include <fstream>
    #include "include/tiny_db.pb.h"
    

遇到的错误

执行编译命令后出现了x86_64架构下的符号未定义错误:

Undefined symbols for architecture x86_64:
  "void absl::lts_20240722::log_internal::LogMessage::CopyToEncodedBuffer<(absl::lts_20240722::log_internal::LogMessage::StringType)0>(std::__1::basic_string_view<char, std::__1::char_traits<char>>)", referenced from:
      absl::lts_20240722::log_internal::LogMessage& absl::lts_20240722::log_internal::LogMessage::operator<<<19>(char const (&) [19]) in tiny_db-9b57b9.o
  "absl::lts_20240722::log_internal::LogMessage& absl::lts_20240722::log_internal::LogMessage::operator<<<unsigned long, 0>(unsigned long const&)", referenced from:
      absl::lts_20240722::log_internal::LogMessage::operator<<(unsigned long) in tiny_db-9b57b9.o
  "absl::lts_20240722::log_internal::LogMessageFatal::LogMessageFatal(char const*, int, std::__1::basic_string_view<char, std::__1::char_traits<char>>)", referenced from:
      Value::SharedDtor() in tiny_db-9b57b9.o
      Value::MergeImpl(google::protobuf::MessageLite&, google::protobuf::MessageLite const&) in tiny_db-9b57b9.o
      google::protobuf::MessageLite::ClassData::full() const in tiny_db-9b57b9.o
      Key::SharedDtor() in tiny_db-9b57b9.o
      Key::MergeImpl(google::protobuf::MessageLite&, google::protobuf::MessageLite const&) in tiny_db-9b57b9.o
      KeyValue::SharedDtor() in tiny_db-9b57b9.o
      KeyValue::MergeImpl(google::protobuf::MessageLite&, google::protobuf::MessageLite const&) in tiny_db-9b57b9.o
      KeyValue::MergeImpl(google::protobuf::MessageLite&, google::protobuf::MessageLite const&) in tiny_db-9b57b9.o
      KeyValue::MergeImpl(google::protobuf::MessageLite&, google::protobuf::MessageLite const&) in tiny_db-9b57b9.o
      ...
  "absl::lts_20240722::log_internal::LogMessageFatal::~LogMessageFatal()", referenced from:
      Value::SharedDtor() in tiny_db-9b57b9.o
      Value::SharedDtor() in tiny_db-9b57b9.o
      Value::MergeImpl(google::protobuf::MessageLite&, google::protobuf::MessageLite const&) in tiny_db-9b57b9.o
      Value::MergeImpl(google::protobuf::MessageLite&, google::protobuf::MessageLite const&) in tiny_db-9b57b9.o
      google::protobuf::MessageLite::ClassData::full() const in tiny_db-9b57b9.o
      google::protobuf::MessageLite::ClassData::full() const in tiny_db-9b57b9.o
      Key::SharedDtor() in tiny_db-9b57b9.o
      Key::SharedDtor() in tiny_db-9b57b9.o
      ...
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::MakeCheckOpString<void const*, void const*>(void const*, void const*, char const*)", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::Check_NEImpl<Value const*, Value*>(Value const* const&, Value* const&, char const*) in tiny_db-9b57b9.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::Check_NEImpl<Key const*, Key*>(Key const* const&, Key* const&, char const*) in tiny_db-9b57b9.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::Check_NEImpl<KeyValue const*, KeyValue*>(KeyValue const* const&, KeyValue* const&, char const*) in tiny_db-9b57b9.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::Check_NEImpl<KeyValueStore const*, KeyValueStore*>(KeyValueStore const* const&, KeyValueStore* const&, char const*) in tiny_db-9b57b9.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::MakeCheckOpString<long long, long long>(long long, long long, char const*)", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::Check_GEImpl<int, int>(int const&, int const&, char const*) in tiny_db-9b57b9.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::Check_GTImpl<int, int>(int const&, int const&, char const*) in tiny_db-9b57b9.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::Check_LTImpl<int, int>(int const&, int const&, char const*) in tiny_db-9b57b9.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::Check_EQImpl<int, int>(int const&, int const&, char const*) in tiny_db-9b57b9.o
  "absl::lts_20240722::log_internal::CheckOpMessageBuilder::ForVar2()", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::MakeCheckOpString<unsigned long long, long long>(unsigned long long, long long, char const*) in tiny_db-9b57b9.o
  "absl::lts_20240722::log_internal::CheckOpMessageBuilder::NewString()", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::MakeCheckOpString<unsigned long long, long long>(unsigned long long, long long, char const*) in tiny_db-9b57b9.o
  "absl::lts_20240722::log_internal::CheckOpMessageBuilder::CheckOpMessageBuilder(char const*)", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>* absl::lts_20240722::log_internal::MakeCheckOpString<unsigned long long, long long>(unsigned long long, long long, char const*) in tiny_db-9b57b9.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

后续尝试的问题

我尝试添加Abseil相关的链接库参数:-labsl_base -labsl_log_internal -labsl_strings -labsl_log_severity,但编译时提示:

ld: library 'absl_log_internal' not found

我确认了Abseil是随Protobuf自动安装的,版本为abseil 20240722.0。

我的疑问

请问我该如何正确编译我的C++文件?

编辑补充:我看到过相关的问题讨论,但不想从源码编译Protobuf,希望能找到更便捷的解决方式。

备注:内容来源于stack exchange,提问作者challmann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 09:14:32