
Jamie Allsop schrieb:
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
use static inline void platform_atomic_thread_fence(memory_order order) { ... }