On 12/07/2009 11:04 AM, Andrew Stitcher wrote:
On Mon, 2009-12-07 at 10:28 -0500, Alan Conway wrote:
On 12/04/2009 12:20 PM, Andrew Stitcher wrote:
On Fri, 2009-12-04 at 11:07 -0500, Alan Conway wrote:
...On 12/02/2009 07:53 PM, Andrew Stitcher wrote:

Cmake build is mostly fine - however the clustering module doesn't build
due to a complication of recent versions of boost.

The cluster&   cluster test build&   pass for me on f11 with
boost-1.37.0-7.fc11.x86_64, which is the yum latest. Is there a machine I can
log into where you see the problem?

In response - I don't understand how you can be building this! The
StoreStatus.o has references to symbols that are only in libboost_system
but it's not directly linked. However having said this I also can't
understand why the autotools build does work by the same token - it's a
bit of a mystery!


ldd shows that in my build cluster.so is indeed linked with boost_system-mt.

   [acon...@rolf cmake]$ ldd src/cluster.so | grep boost
        libboost_filesystem-mt.so.4 =>  /usr/lib64/libboost_filesystem-mt.so.4
(0x00007f1d97f67000)
        libboost_program_options-mt.so.4 =>
/usr/lib64/libboost_program_options-mt.so.4 (0x00007f1d978ac000)
        libboost_system-mt.so.4 =>  /usr/lib64/libboost_system-mt.so.4
(0x00007f1d95f44000)

Also note that libcommon uses boost::filesystem and  links without problems,
although perhaps StoreStatus is using different symbols. What missing symbols
are you seeing?

Ok, I haven't explained in enough detail:

libqpidcommon isn't a problem because by default shared objects are
allowed to have unresolved symbols at link time on the Unix systems I
know - if they weren't resolved at the run time load you'd get an error
- generally sigkill to the process.

ldd doesn't tell you what you need to know here as it gives the
transitive linkage - ie in this case libboost_system is loaded because
libboost_filesystem requires it. To get the actual (non transitive)
requires of an object you need to use objdump -p.

When we build plugin modules for qpid we tell the linker to give an
error if it finds unresolved symbols when linking against the non
transitive requirements (--no-undefined to the linker -Wl,--no-undefined
to the compiler). It's possible that libtool adds another option to make
it check the symbols transitively, which would explain why the autotools
build works, but I can't see why your cmake build could be different
from mine.

My cmake build does not have those flags in the link line for cluster.so:

/usr/bin/ccache /usr/bin/distcc g++ -fPIC -g -O -shared -Wl,-soname,cluster.so -o cluster.so CMakeFiles/cluster.dir/qpid/cluster/Quorum_cman.o CMakeFiles/cluster.dir/qpid/cluster/Cluster.o CMakeFiles/cluster.dir/qpid/cluster/Decoder.o CMakeFiles/cluster.dir/qpid/cluster/ClusterMap.o CMakeFiles/cluster.dir/qpid/cluster/ClusterPlugin.o CMakeFiles/cluster.dir/qpid/cluster/Connection.o CMakeFiles/cluster.dir/qpid/cluster/ConnectionCodec.o CMakeFiles/cluster.dir/qpid/cluster/Cpg.o CMakeFiles/cluster.dir/qpid/cluster/UpdateClient.o CMakeFiles/cluster.dir/qpid/cluster/RetractClient.o CMakeFiles/cluster.dir/qpid/cluster/ErrorCheck.o CMakeFiles/cluster.dir/qpid/cluster/Event.o CMakeFiles/cluster.dir/qpid/cluster/EventFrame.o CMakeFiles/cluster.dir/qpid/cluster/ExpiryPolicy.o CMakeFiles/cluster.dir/qpid/cluster/FailoverExchange.o CMakeFiles/cluster.dir/qpid/cluster/Multicaster.o CMakeFiles/cluster.dir/qpid/cluster/OutputInterceptor.o CMakeFiles/cluster.dir/qpid/cluster/PollerDispatch.o CMakeFiles/cluster.dir/qpid/cluster/InitialStatusMap.o CMakeFiles/cluster.dir/qpid/cluster/MemberSet.o CMakeFiles/cluster.dir/qpid/cluster/StoreStatus.o -lcpg -lcman libqpidbroker.so.0.6 libqpidclient.so.0.6 -lboost_filesystem-mt libqpidcommon.so.0.6 -lboost_program_options-mt -lboost_filesystem-mt -luuid -ldl -lrt -lsasl2 -Wl,-rpath,/home/aconway/qpid/qpid/cmake/src

I don't know why those flags aren't present, maybe something wrong with the CMAKE_COMPILER_IS_GNUCXX that's causing it to fail on my box? How can I debug what cmake is doing here?

The symbols that are unresolved in all of the shared objects that use
boost_filesystem due to inline expansions of things from it are:
                  U boost::system::get_system_category()
                  U boost::system::get_generic_category()

Yep, they're undefined for me as well but not causing a compile error due to the missing flags. I'm still not clear on what the solution is here:
 - drop the --no-undefined-flags
 - explicitly link with boost system if present

We could drop the --no-undefined flag for cluster.so only as a workaround if linking with boost system is tricky.

---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:dev-subscr...@qpid.apache.org

Reply via email to