ubuntu 如何构建C++ protobuf?

fslejnso  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(157)

如何构建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,因为版本太旧(3.12 in apt4.22 in source),所以我尝试从源代码构建它们。

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,使没有--libs absl_log_internal_check_opg++ pb.cpp pb.pb.cc $(pkg-config --cflags --libs protobuf)也能正常工作?

巴泽尔

我已经完全按照步骤在README.md上没有警告,但仍然无法使用这些文件。
错误:

  • 缺少已知类型(例如,timestamp.proto
  • official build ( protoc-22.0-linux-x86_64.zip )中,部分include/
  • 对应的*.cc*.h存在于bazel-bin/src/google/protobuf/wkt/google/protobuf(仅缺少*.proto
  • 它们都在source directory中,所以不知道为什么它们被删除
  • 我不想直接从这个目录复制,因为它包含额外的文件(unittest_*
  • *.pc文件未包含在构建中(用作pkg-config --cflags --libs protobuf
  • Source file

为了方便起见,下面是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)
cngwdvgl

cngwdvgl1#

问题是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"

(this可能发生在CMake的新版本中,其中protobuf_generate_cpp已被标记为旧版命令),然后使用附加变量调用cmake

cmake -Dprotobuf_MODULE_COMPATIBLE:BOOL=ON ..

找到解决方案here

相关问题