Bug #14788
closedlibrados (C++) linker error (undefined reference)
0%
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
Updated by Joao Eduardo Luis about 8 years ago
- Source changed from other to Community (dev)
Updated by Kefu Chai about 8 years ago
- Status changed from New to 12
- Assignee set to Kefu Chai
so it sounds like a regression after introducing the buffer::list::const_iterator
.
Updated by Brad Hubbard about 8 years ago
What version is this?
That missing semicolon was fixed last year.
I can't reproduce this behaviour on master, can you Jesse?
Updated by Kefu Chai about 8 years ago
- Related to Bug #13429: bufferlist::iterator no longer ABI compatible added
Updated by Kefu Chai about 8 years ago
- 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.
Updated by Kefu Chai about 8 years ago
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.
Updated by Kefu Chai about 8 years ago
- Status changed from New to Fix Under Review
Updated by Kefu Chai about 8 years ago
- Status changed from Fix Under Review to Pending Backport
Updated by Nathan Cutler about 8 years ago
- Copied to Backport #14916: infernalis: librados (C++) linker error (undefined reference) added
Updated by Loïc Dachary over 7 years ago
- Status changed from Pending Backport to Resolved