Bug #14788
closed
librados (C++) linker error (undefined reference)
Added by Jesse Williamson about 8 years ago.
Updated over 7 years ago.
Description
When compiling a patched librados C++ example (or other C++ programs-- see included patchfile), pointing to the headers in the git repository causes linker errors
against librados (note that the stock Makefile uses only the system-wide headers and libraries, so here we're manually pointing at
the local build):
g++ -g -c hello_world.cc -o hello_world.o -std=c++0x -I../../src/include
g++ -I../../src/include -g hello_world.o -o librados_hello_world -Wl,-rpath,../../../ceph/src/.libs -L../../../ceph/src/.libs/ -lrados
hello_world.o: In function `ceph::buffer::list::iterator_impl<false>::iterator_impl(ceph::buffer::list*, unsigned int)':
/home/jwilliamson/work/ceph/ceph/examples/librados/../../src/include/rados/buffer.h:289: undefined reference to `ceph::buffer::list::iterator_impl<false>::advance(int)'
Using the system-wide headers results in successful linkage:
g++ -g -c hello_world.cc -o hello_world.o -std=c++0x
g++ -g hello_world.o -o librados_hello_world -Wl,-rpath,../../../ceph/src/.libs -L../../../ceph/src/.libs/ -lrados
Files
- Source changed from other to Community (dev)
- Status changed from New to 12
- Assignee set to Kefu Chai
so it sounds like a regression after introducing the buffer::list::const_iterator
.
What version is this?
That missing semicolon was fixed last year.
I can't reproduce this behaviour on master, can you Jesse?
- Related to Bug #13429: bufferlist::iterator no longer ABI compatible added
- Status changed from 12 to New
this reminds me of #13429.
turns out i was compiling with the header in my source repo, while linking against the packaged librados in system.
if that's the case which Jesse ran into. it's because the new buffer.h is referencing the symbols of buffer::list::iterator_impl<false>::*
. so, if the client code is compiled using the new header file, the resulting object code will need the (weak) symbols of buffer::list::iterator_impl<false>::*
.
but if the client code is compiled using the old header file, it will linked just fine with the new library.
the buffer::list::iterator_impl
template class was introduced when adding list::const_iterator
, in hope to consolidate the shared bits of list::const_iterator
and list::iterator
. but it introduced some ABI incompatibilities. #13429 addressed some of them by re-exposing the methods offered by list::iterator
in hammer using their old symbol names (signatures). but it does not remove the dependency to the buffer::list::iterator_impl
symbols.
i will try to add __attribute__ ((visibility ("hidden")))
to the template to hide its symbol to see how it works.
- Status changed from New to Fix Under Review
- Backport set to infernalis
- Status changed from Fix Under Review to Pending Backport
- Copied to Backport #14916: infernalis: librados (C++) linker error (undefined reference) added
- Status changed from Pending Backport to Resolved
Also available in: Atom
PDF