如何构建C++ protobuf使g++ pb.cpp pb.pb.cc $(pkg-config --cflags --libs protobuf)
工作?(下面提供了pb.cpp
,pb.pb.cc
由不完整的protobuf构建生成)编译版本必须为4.22.0或更高版本。
我不想使用apt-get install -y protobuf-compiler libprotobuf-dev
,因为版本太旧(3.12 in apt
,4.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_op
的g++ 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)
1条答案
按热度按时间cngwdvgl1#
问题是
CMake
命令启动的CMake
提供的脚本Modules/FindProtobuf.cmake
与
protobuf
版本22+(最高24.3)不兼容,无法正确链接protobuf
库。为了解决这个问题,你需要使用命令这将强制
cmake
使用protobuf
库提供的脚本/usr/lib/cmake/protobuf/protobuf-config.cmake
。如果在此更改后,您看到
CMake
错误(this可能发生在
CMake
的新版本中,其中protobuf_generate_cpp
已被标记为旧版命令),然后使用附加变量调用cmake
找到解决方案here