[Bug c++/53899] [C++0x] undefined reference to std::atomic
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53899 --- Comment #5 from Neil Nelson 2012-07-09 16:06:11 UTC --- Jonathan, (redi at gcc dot gnu.org ) I installed g++-4.7 and obtained a good improvement over the prior results with the following output boost_lockfree/libs/lockfree/test$ g++-4.7 -std=c++0x bench_3.cpp -o bench_3 In file included from /usr/include/boost/lockfree/detail/atomic.hpp:15:0, from ../../../boost/lockfree/fifo.hpp:26, from bench_3.cpp:1: /usr/include/c++/4.7/atomic: In instantiation of ‘struct std::atomic >’: /usr/include/boost/lockfree/detail/freelist.hpp:203:29: required from here /usr/include/c++/4.7/atomic:160:7: error: function ‘std::atomic<_Tp>::atomic() [with _Tp = boost::lockfree::detail::tagged_ptr]’ defaulted on its first declaration with an exception-specification that differs from the implicit declaration ‘std::atomic >::atomic()’ /usr/include/c++/4.7/atomic: In instantiation of ‘struct std::atomic >::node> >’: ../../../boost/lockfree/fifo.hpp:287:29: required from ‘class boost::lockfree::detail::fifo >’ ../../../boost/lockfree/fifo.hpp:315:7: required from ‘class boost::lockfree::fifo’ bench_3.cpp:18:5: required from here /usr/include/c++/4.7/atomic:160:7: error: function ‘std::atomic<_Tp>::atomic() [with _Tp = boost::lockfree::detail::tagged_ptr >::node>]’ defaulted on its first declaration with an exception-specification that differs from the implicit declaration ‘std::atomic >::node> >::atomic()’ Tim Blechmann posted on the Boost list this morning he was doing final testing for the Boost 51 release. I will copy this to him in case he has an idea. My impression is that g++ -std=c++0x and boost lockfree are rather close. Neil On 07/09/2012 08:45 AM, redi at gcc dot gnu.org wrote: > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53899 > > --- Comment #4 from Jonathan Wakely 2012-07-09 > 14:45:26 UTC --- > (In reply to comment #2) >> The lockfree code is invalid anyway because >> boost::lockfree::detail::tagged_ptr >> doesn't have a trivial default constructor, so it can't be used with >> std::atomic > Actually ignore that part - I misread the spec. >
[Bug c++/53899] [C++0x] undefined reference to std::atomic
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53899 --- Comment #3 from Neil Nelson 2012-07-09 14:34:18 UTC --- Redi, Thank you for your very quick and detailed responses. Looks like I have some work to do on my end. I will copy this to the boost lockfree author. Neil On 07/09/2012 08:30 AM, redi at gcc dot gnu.org wrote: > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53899 > > --- Comment #2 from Jonathan Wakely 2012-07-09 > 14:30:28 UTC --- > The lockfree code is invalid anyway because > boost::lockfree::detail::tagged_ptr > doesn't have a trivial default constructor, so it can't be used with > std::atomic >
[Bug c++/53899] New: [C++0x] undefined reference to std::atomic
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53899 Bug #: 53899 Summary: [C++0x] undefined reference to std::atomichttp://tim.klingt.org/boost_lockfree.tar.gz The following program when compiled and executed from libs/lockfree/test (including the other required boost distribution components), a folder in the prior gz, will work OK using g++ bench_3.cpp -o bench_3 but gives errors of the following kind when using g++ -std=c++0x bench_3.cpp -o bench_3 undefined reference to `std::atomic >::node> >::load(std::memory_order) const' undefined reference to `std::atomic >::node> >::compare_exchange_weak(boost::lockfree::detail::tagged_ptr >::node>&, boost::lockfree::detail::tagged_ptr >::node>, std::memory_order)' undefined reference to `std::atomic >::node> >::store(boost::lockfree::detail::tagged_ptr >::node>, std::memory_order)' This item may be along the line given in Bug 49445 [C++0x] Undefined reference to std::atomic "operator float" Thank you. Neil // bench_3.cpp #include "../../../boost/lockfree/fifo.hpp" int elements = 100; int iterations = 50; #define FIFO \ boost::lockfree::fifo f(elements); #define FIFO_FULL \ boost::lockfree::fifo f(elements); \ for (int i = 0; i != elements; ++i) \ f.enqueue_unsafe(i); \ __attribute__ ((noinline)) __attribute__ ((flatten)) void test_fifo_push(void) { FIFO for (int i = 0; i != elements; ++i) f.enqueue(i); } __attribute__ ((noinline)) __attribute__ ((flatten)) void test_fifo_pop(void) { FIFO_FULL long out; for (int i = 0; i != elements; ++i) f.dequeue(out); } int main() { for (int i = 0; i != iterations; ++i) test_fifo_push(); for (int i = 0; i != iterations; ++i) test_fifo_pop(); }