如何构建C++ protobuf?

4

如何构建C++ protobuf以使g++ pb.cpp pb.pb.cc $(pkg-config --cflags --libs protobuf)有效?(以下提供了pb.cpppb.pb.cc由不完整的protobuf构建生成)编译版本必须为4.22.0或更高版本。

我不想使用apt-get install -y protobuf-compiler libprotobuf-dev,因为版本太旧( apt中的3.12, 源中的4.22),所以我尝试从源代码构建它们自己。


CMake

cmake/README.md中获取步骤。

> cmake -S . -B build -DCMAKE_CXX_STANDARD=14
<truncated, no errors>

> cmake --build build --target install
<truncated, no errors>
Scanning dependencies of target log_internal_check_op
[ 43%] Building CXX object third_party/abseil-cpp/absl/log/CMakeFiles/log_internal_check_op.dir/internal/check_op.cc.o
[ 44%] Linking CXX shared library libabsl_log_internal_check_op.so
[ 44%] Built target log_internal_check_op
<truncated, no errors>

> g++ pb.cpp pb.pb.cc $(pkg-config --cflags --libs protobuf)
/usr/bin/ld: /tmp/cc3B1oMq.o: undefined reference to symbol '_ZN4absl12lts_2023012512log_internal21CheckOpMessageBuilder7ForVar2Ev'
/usr/bin/ld: /usr/local/lib/libabsl_log_internal_check_op.so.2301.0.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

> g++ pb.cpp pb.pb.cc $(pkg-config --cflags --libs protobuf --libs absl_log_internal_check_op)
<truncated, no errors>

尽管最后一个命令运行良好,但如果我使用 apt-get install -y protobuf-compiler libprotobuf-dev ,则不需要额外的 pkg-config --cflags --libs absl_log_internal_check_op
我该如何正确构建 protobur,以便 g++ pb.cpp pb.pb.cc $(pkg-config --cflags --libs protobuf) 能够在没有 --libs absl_log_internal_check_op 的情况下工作?

Bazel

我完全按照README.md的步骤操作,但仍然无法使用这些文件。

错误如下:

常见类型(例如timestamp.proto)缺失
- 在官方构建(protoc-22.0-linux-x86_64.zip中,位于include/的一部分 - 相应的*.cc*.h存在于bazel-bin/src/google/protobuf/wkt/google/protobuf中(仅缺少*.proto) - 它们都在源目录中,所以不知道为什么被删除了 - 我不想直接从此目录复制,因为它包含额外的文件(unittest_**.pc文件未包含在构建中(用作pkg-config --cflags --libs protobuf
- 源文件

为了方便起见,这里是Dockerfile

FROM ubuntu:20.04

ARG INSTALL_LOCATION="./installed"
ENV PATH="$PATH:$INSTALL_LOCATION/bin"

RUN apt-get update
RUN apt-get install -y g++ git

# Bazel install (Protobuf dependency)
# https://bazel.build/install/ubuntu#install-on-ubuntu
RUN apt-get install -y apt-transport-https curl gnupg
RUN curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor >bazel-archive-keyring.gpg
RUN mv bazel-archive-keyring.gpg /usr/share/keyrings
RUN echo "deb [arch=amd64 signed-by=/usr/share/keyrings/bazel-archive-keyring.gpg] https://storage.googleapis.com/bazel-apt stable jdk1.8" | tee /etc/apt/sources.list.d/bazel.list
RUN apt-get update
RUN apt-get install -y bazel
RUN bazel --version

# Protobuf C++ build
# https://github.com/protocolbuffers/protobuf/blob/d41deb9dc6602701b157739a314ad6405f9b89ed/src/README.md#c-protobuf---unix
RUN git clone https://github.com/protocolbuffers/protobuf.git
RUN cd protobuf && git submodule update --init --recursive
RUN cd protobuf && bazel build :protoc :protobuf
RUN cd protobuf && cp bazel-bin/protoc "$INSTALL_LOCATION/bin"

# Only protoc installed
# Missing:
#   protobuf.pc: pkg-config --cflags --libs protobuf
#   google/protobuf/timestamp.proto: part of protoc-22.0-linux-x86_64.zip which should be included

COPY pb.proto .
# Generates pb.pb.cc and pb.pb.h
RUN protoc --cpp_out=. pb.proto

COPY pb.cpp .
# Error
# RUN g++ pb.cpp pb.pb.cc $(pkg-config --cflags --libs protobuf)

pb.proto

syntax = "proto3";

package pb;

// Well-known type that ships with release distribution
import "google/protobuf/timestamp.proto";

message Test {
  google.protobuf.Timestamp time = 1;
}

pb.cpp

#include "pb.pb.h"

int main() {
  GOOGLE_PROTOBUF_VERIFY_VERSION;

  pb::Test some_var;

  /* other code here, but not required for error */
}

ldd

libprotobuf-dev

> ldd /usr/lib/x86_64-linux-gnu/libprotobuf.so
    linux-vdso.so.1 (0x00007fff10b24000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2281be8000)
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f2281a06000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2281814000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f2281f00000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f22817f9000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f22816aa000)

CMake

> ldd /usr/local/lib/libprotobuf.so
    linux-vdso.so.1 (0x00007fff3098d000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5952b05000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f5952ae9000)
    libabsl_die_if_null.so.2301.0.0 => /usr/local/lib/libabsl_die_if_null.so.2301.0.0 (0x00007f5952ae4000)
    libabsl_statusor.so.2301.0.0 => /usr/local/lib/libabsl_statusor.so.2301.0.0 (0x00007f5952ade000)
    libabsl_log_internal_check_op.so.2301.0.0 => /usr/local/lib/libabsl_log_internal_check_op.so.2301.0.0 (0x00007f5952ad5000)
    libabsl_log_internal_message.so.2301.0.0 => /usr/local/lib/libabsl_log_internal_message.so.2301.0.0 (0x00007f5952ac9000)
    libabsl_log_internal_nullguard.so.2301.0.0 => /usr/local/lib/libabsl_log_internal_nullguard.so.2301.0.0 (0x00007f5952ac2000)
    libabsl_hash.so.2301.0.0 => /usr/local/lib/libabsl_hash.so.2301.0.0 (0x00007f5952abd000)
    libabsl_raw_hash_set.so.2301.0.0 => /usr/local/lib/libabsl_raw_hash_set.so.2301.0.0 (0x00007f5952ab8000)
    libabsl_status.so.2301.0.0 => /usr/local/lib/libabsl_status.so.2301.0.0 (0x00007f5952aac000)
    libabsl_cord.so.2301.0.0 => /usr/local/lib/libabsl_cord.so.2301.0.0 (0x00007f5952a92000)
    libabsl_synchronization.so.2301.0.0 => /usr/local/lib/libabsl_synchronization.so.2301.0.0 (0x00007f5952a82000)
    libabsl_time.so.2301.0.0 => /usr/local/lib/libabsl_time.so.2301.0.0 (0x00007f5952a68000)
    libabsl_time_zone.so.2301.0.0 => /usr/local/lib/libabsl_time_zone.so.2301.0.0 (0x00007f5952a48000)
    libabsl_str_format_internal.so.2301.0.0 => /usr/local/lib/libabsl_str_format_internal.so.2301.0.0 (0x00007f5952a2b000)
    libabsl_bad_variant_access.so.2301.0.0 => /usr/local/lib/libabsl_bad_variant_access.so.2301.0.0 (0x00007f5952a26000)
    libabsl_strings.so.2301.0.0 => /usr/local/lib/libabsl_strings.so.2301.0.0 (0x00007f5952a05000)
    libabsl_throw_delegate.so.2301.0.0 => /usr/local/lib/libabsl_throw_delegate.so.2301.0.0 (0x00007f59529fe000)
    libabsl_spinlock_wait.so.2301.0.0 => /usr/local/lib/libabsl_spinlock_wait.so.2301.0.0 (0x00007f59529f7000)
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5952815000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f59527fa000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5952608000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f5952df1000)
    libabsl_raw_logging_internal.so.2301.0.0 => /usr/local/lib/libabsl_raw_logging_internal.so.2301.0.0 (0x00007f5952603000)
    libabsl_examine_stack.so.2301.0.0 => /usr/local/lib/libabsl_examine_stack.so.2301.0.0 (0x00007f59525fc000)
    libabsl_log_internal_format.so.2301.0.0 => /usr/local/lib/libabsl_log_internal_format.so.2301.0.0 (0x00007f59525f7000)
    libabsl_log_internal_proto.so.2301.0.0 => /usr/local/lib/libabsl_log_internal_proto.so.2301.0.0 (0x00007f59525f2000)
    libabsl_strerror.so.2301.0.0 => /usr/local/lib/libabsl_strerror.so.2301.0.0 (0x00007f59525ed000)
    libabsl_log_internal_log_sink_set.so.2301.0.0 => /usr/local/lib/libabsl_log_internal_log_sink_set.so.2301.0.0 (0x00007f59525e6000)
    libabsl_log_internal_globals.so.2301.0.0 => /usr/local/lib/libabsl_log_internal_globals.so.2301.0.0 (0x00007f59525e1000)
    libabsl_log_globals.so.2301.0.0 => /usr/local/lib/libabsl_log_globals.so.2301.0.0 (0x00007f59525d9000)
    libabsl_base.so.2301.0.0 => /usr/local/lib/libabsl_base.so.2301.0.0 (0x00007f59525d3000)
    libabsl_city.so.2301.0.0 => /usr/local/lib/libabsl_city.so.2301.0.0 (0x00007f59525ce000)
    libabsl_low_level_hash.so.2301.0.0 => /usr/local/lib/libabsl_low_level_hash.so.2301.0.0 (0x00007f59525c9000)
    libabsl_cordz_info.so.2301.0.0 => /usr/local/lib/libabsl_cordz_info.so.2301.0.0 (0x00007f59525c2000)
    libabsl_cord_internal.so.2301.0.0 => /usr/local/lib/libabsl_cord_internal.so.2301.0.0 (0x00007f59525a7000)
    libabsl_crc_cord_state.so.2301.0.0 => /usr/local/lib/libabsl_crc_cord_state.so.2301.0.0 (0x00007f595259f000)
    libabsl_cordz_functions.so.2301.0.0 => /usr/local/lib/libabsl_cordz_functions.so.2301.0.0 (0x00007f595259a000)
    libabsl_stacktrace.so.2301.0.0 => /usr/local/lib/libabsl_stacktrace.so.2301.0.0 (0x00007f5952595000)
    libabsl_symbolize.so.2301.0.0 => /usr/local/lib/libabsl_symbolize.so.2301.0.0 (0x00007f595258b000)
    libabsl_malloc_internal.so.2301.0.0 => /usr/local/lib/libabsl_malloc_internal.so.2301.0.0 (0x00007f5952584000)
    libabsl_int128.so.2301.0.0 => /usr/local/lib/libabsl_int128.so.2301.0.0 (0x00007f595257a000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f595242b000)
    libabsl_strings_internal.so.2301.0.0 => /usr/local/lib/libabsl_strings_internal.so.2301.0.0 (0x00007f5952425000)
    libabsl_log_sink.so.2301.0.0 => /usr/local/lib/libabsl_log_sink.so.2301.0.0 (0x00007f5952420000)
    libabsl_cordz_handle.so.2301.0.0 => /usr/local/lib/libabsl_cordz_handle.so.2301.0.0 (0x00007f5952418000)
    libabsl_crc32c.so.2301.0.0 => /usr/local/lib/libabsl_crc32c.so.2301.0.0 (0x00007f5952412000)
    libabsl_exponential_biased.so.2301.0.0 => /usr/local/lib/libabsl_exponential_biased.so.2301.0.0 (0x00007f595240d000)
    libabsl_debugging_internal.so.2301.0.0 => /usr/local/lib/libabsl_debugging_internal.so.2301.0.0 (0x00007f5952406000)
    libabsl_demangle_internal.so.2301.0.0 => /usr/local/lib/libabsl_demangle_internal.so.2301.0.0 (0x00007f59523f9000)
    libabsl_crc_internal.so.2301.0.0 => /usr/local/lib/libabsl_crc_internal.so.2301.0.0 (0x00007f59523f0000)

> ldd /usr/local/lib/libabsl_log_internal_check_op.so.2301.0.0
    linux-vdso.so.1 (0x00007fff09986000)
    libabsl_log_internal_nullguard.so.2301.0.0 => /usr/local/lib/libabsl_log_internal_nullguard.so.2301.0.0 (0x00007fa936193000)
    libabsl_strings.so.2301.0.0 => /usr/local/lib/libabsl_strings.so.2301.0.0 (0x00007fa936172000)
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa935f8c000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa935f71000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa935d7f000)
    libabsl_strings_internal.so.2301.0.0 => /usr/local/lib/libabsl_strings_internal.so.2301.0.0 (0x00007fa935d79000)
    libabsl_throw_delegate.so.2301.0.0 => /usr/local/lib/libabsl_throw_delegate.so.2301.0.0 (0x00007fa935d70000)
    libabsl_raw_logging_internal.so.2301.0.0 => /usr/local/lib/libabsl_raw_logging_internal.so.2301.0.0 (0x00007fa935d6b000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa935c1c000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fa9361a3000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa935bf9000)

请在通过CMake生成的文件上执行ldd libprotobuf.so,并将其与通过libprotobuf-dev获取的文件上的ldd libprotobuf.so进行比较。 - undefined
@kiner_shah ldd信息已添加。列出的内容可能在您自己构建的项目中更长,但是所有库都已找到。 - undefined
我不确定为什么你的protobuf构建需要依赖libabseil。我建议从你的本地机器中移除libabseil安装,然后重试。 - undefined
@kiner_shah 我该怎么做呢?Abseil是protobuf的一部分。我对CMake不太熟悉,但是Abseil在CMake文件中没有正确链接吗? - undefined
我建议在他们的代码库上提出问题,并要求他们的开发人员解决。另外,你想要最新版本有什么特别的原因吗?我能够编译出适用于安卓的v3.21.12版本,而且没有任何依赖关系。 - undefined
显示剩余3条评论
1个回答

0
问题在于由CMake命令启动的CMake提供的脚本Modules/FindProtobuf.cmake。
find_package(Protobuf REQUIRED)

不兼容protobuf版本22+(最高24.3),无法正确链接protobuf库。为了解决这个问题,您需要使用以下命令。
find_package(Protobuf REQUIRED CONFIG)

这将强制`cmake`使用由`protobuf`库提供的脚本`/usr/lib/cmake/protobuf/protobuf-config.cmake`。
如果在此更改后出现`CMake`错误,请注意。
Unknown CMake command "protobuf_generate_cpp"

(这可能发生在新版本的CMake中,其中protobuf_generate_cpp被标记为遗留命令)然后使用额外的变量调用cmake。
cmake -Dprotobuf_MODULE_COMPATIBLE:BOOL=ON ..

解决方案在这里找到了这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接