I’m compiling source files test.cpp
(include proto.pb.h) and proto.pb.cc
together to a binary file.
I download a library libProtobufLite.a
, and compile with command: g++ test.cpp proto.pb.cc -Iinclude -L. -lProtobufLite --std=c++11
.
But I got an error: proto.pb.cc undefined reference to `google::protobuf::internal::kEmptyString'
nm libProtobufLite.a | grep "EmptyString"
shows that symbol name in library is
_ZN6google8protobuf8internal12kEmptyStringB5cxx11E
while the symbol in proto.pb.o
is
_ZN6google8protobuf8internal12kEmptyStringE
my gcc version is
Using built-in specs.
COLLECT_GCC=/usr/local/bin/g++
COLLECT_LTO_WRAPPER=/usr/local/bin/../libexec/gcc/x86_64-pc-linux-gnu/7.5.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-7.5.0/configure --prefix=/root/init_server/install --with-dwarf-2 --disable-libstdcxx-dual-abi
Thread model: posix
gcc version 7.5.0 (GCC)
I try to add -D_GLIBCXX_USE_CXX11_ABI=1
to comiling command, but it doesn’t work.
How to compile my source files and link to that library?
— update —
I tried a new gcc toolchain, /opt/rh/devtoolset-7/root/usr/bin/g++
, but I got the same problem (with -D_GLIBCXX_USE_CXX11_ABI=1
in compiling command).
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/devtoolset-7/root/usr --mandir=/opt/rh/devtoolset-7/root/usr/share/man --infodir=/opt/rh/devtoolset-7/root/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --enable-plugin --with-linker-hash-style=gnu --enable-initfini-array --with-default-libstdcxx-abi=gcc4-compatible --with-isl=/builddir/build/BUILD/gcc-7.3.1-20180303/obj-x86_64-redhat-linux/isl-install --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)
— update —
After upgrading gcc to gcc 8.5.0, this problem solved.
I experimented with three scenarios. I’m curious why Case2 fails
- Case 1. gcc 7.5.0 with configure
--disable-libstdcxx-dual-abi
and compiling option-D_GLIBCXX_USE_CXX11_ABI=1
: failed - Case 2. gcc 7.3.1 with configure
--with-default-libstdcxx-abi=gcc4-compatible
and compiling option-D_GLIBCXX_USE_CXX11_ABI=1
: also failed - Case 3. gcc 8.5.0 without any abi configure or compiling option: succeed
1
--disable-libstdcxx-dual-abi
Disable support for the new, C++11-conforming implementations ofstd::string
,std::list
etc. so that the library only provides definitions of types using the old ABI (see Dual ABI). This option changes the library ABI.
That GCC 7.5.0 is configured so it cannot be uses with the downloaded libProtobufLite.a
that is built with the modern ABI. You should build this library from the sources.
The _GLIBCXX_USE_CXX11_ABI
macro does not help, because it’s impossible to switch on something that is not available.
0