|
Boost : |
Subject: [boost] [boost.atomic] linker error with gcc 4.1.2
From: Jamie Allsop (ja11sop_at_[hidden])
Date: 2010-03-02 21:09:24
With gcc 4.1.2 (gcc 4.3.x is fine) I am seeing this linker error:
.build/debug/working/SourceOne.o:
In function `void
boost::detail::atomic::platform_atomic_thread_fence<boost::memory_order>(boost::memory_order)':
/thirdparty/boost/boost_1_42/boost/smart_ptr/detail/shared_count.hpp:229:
multiple definition of `void
boost::detail::atomic::platform_atomic_thread_fence<boost::memory_order>(boost::memory_order)'
.build/debug/working/SourceTwo.o:
/thirdparty/boost/boost_1_42/boost/atomic/detail/gcc-x86.hpp:63: first
defined here
Which doesn't make a lot of sense at first glance, but on closer
inspection I see that:
boost/atomic/detail/base.hpp defines platform_atomic_thread_fence as:
template<typename T>
static inline void platform_atomic_thread_fence(T order)
{
/* FIXME: this does not provide
sequential consistency, need one global
variable for that... */
platform_atomic<int> a;
a.exchange(0, order);
}
and then it is defined as a specialisation in:
boost/atomic/detail/gcc-x86.hpp as:
template<>
void platform_atomic_thread_fence(memory_order order)
{
switch(order) {
case memory_order_seq_cst:
full_fence();
case memory_order_acquire:
case memory_order_consume:
case memory_order_acq_rel:
case memory_order_release:
__asm__ __volatile__ ("" ::: "memory");
default:;
}
}
Is this a compiler error or should the specialisation be declared as:
template<>
inline void platform_atomic_thread_fence(memory_order order)
(which will work)
Suggestions?
Jamie
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk