Boost logo

Boost :

Subject: Re: [boost] [boost.atomic] linker error with gcc 4.1.2
From: Oliver Kowalke (k-oli_at_[hidden])
Date: 2010-03-03 12:57:15


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)
{ ... }


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk