C++项目使用Homebrew安装的Protobuf编译链接时Abseil相关符号未定义的问题求助
C++项目使用Homebrew安装的Protobuf编译链接时Abseil相关符号未定义的问题求助
我正在尝试在自己的应用中使用Protobuf,现在需要完成链接步骤来运行程序。
已执行的操作步骤
- 通过Homebrew安装Protobuf:
brew install protobuf - 检查Abseil是否已安装(因为遇到了相关错误):
brew list --versions abseil - 更新了链接器命令,使用的编译命令如下:
/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 - 编译proto文件:
protoc --cpp_out=./include tiny_db.proto - 在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
相关产品推荐
相关产品推荐

