Связывание рекурсивного создания шаблона с boost :: thread - PullRequest
0 голосов
/ 12 ноября 2011

Я столкнулся с проблемой, когда попытался связать следующий код: test.cpp:

#include "Singleton.h"    
#include "SingletonManager.h"
#include <boost/thread/thread.hpp>
#include <boost/thread/barrier.hpp>
const size_t MAXTHREADS = 4;
// class holds the startuped threads + data
class test_threads
{
    public:
        static boost::thread * m_thread[MAXTHREADS];
        static boost::thread_group m_thrgroup;
        static boost::barrier m_barrier;
        static size_t mpos;
        virtual void pipe() =0;
};
boost::thread *     test_threads::m_thread[MAXTHREADS];
boost::thread_group test_threads::m_thrgroup;
boost::barrier      test_threads::m_barrier(MAXTHREADS+1); // launched threads + main
size_t              test_threads::mpos = 0;
// the singleton class which we instantiate few times.
template<size_t _id>
class FastBar : public Singleton<FastBar<_id>, SingletonAllocator<FastBar<_id>, AllocationType::Static> >
{
    public:
        FastBar()
        {}

        ~FastBar() throw()
        {}

        void pipe()
        {
            std::cout<<"|";
        }
    private:
        static const size_t id = _id;
};
// recursive template to instantiate N FastBars to run in threads
template<size_t i>
class initFastBar
{
public:
    initFastBar<i-1> compileloop;
    typedef initFastBar<i> initbar;
    static void __start()
    {
        test_threads::m_barrier.wait();
        FastBar<i>::instance().pipe();
    }
    initFastBar()
    {
        test_threads::m_thread[test_threads::mpos] = new boost::thread(initFastBar<i>::__start);
        test_threads::m_thrgroup.add_thread(test_threads::m_thread[test_threads::mpos]);
        test_threads::mpos++;
    }
};
// end recurse
template<>
class initFastBar<0>
{
    typedef initFastBar<0> compileloop;
};
void execute_ThreadRefencing_test()
{
    // startup 16 threads
    test_threads::mpos = 0;
    initFastBar<MAXTHREADS> init;
    // syncronize
    test_threads::m_barrier.wait();
    // wait for to complete the tasks.
    test_threads::m_thrgroup.join_all();
    SingletonManager::instance()->release_all();
}

результатом является довольно загадочная ошибка компоновщика, но он говорит, что "я несвязываю agaist с libboost_thread.a ":

Linking console executable: build\Singletons_Debug_i686.exe
build/debug/i686/obj/test_threading.o:test_threading.cpp:(.text$_ZN5boost12thread_groupD1Ev[boost::thread_group::~thread_group()]+0x77): undefined reference to `_imp___ZN5boost6threadD1Ev'
build/debug/i686/obj/test_threading.o:test_threading.cpp:(.text$_ZN5boost12thread_group8join_allEv[boost::thread_group::join_all()]+0x87): undefined reference to `_imp___ZN5boost6thread4joinEv'
build/debug/i686/obj/test_threading.o:test_threading.cpp:(.text$_ZN5boost6detail19basic_cv_list_entry4waitENS0_7timeoutE[boost::detail::basic_cv_list_entry::wait(boost::detail::timeout)]+0x7d): undefined reference to `_imp___ZN5boost11this_thread18interruptible_waitEPvNS_6detail7timeoutE'
build/debug/i686/obj/test_threading.o:test_threading.cpp:(.text$_ZN5boost6threadC1IPFvvEEET_NS_10disable_ifINS_14is_convertibleIRS4_NS_6detail13thread_move_tIS4_EEEEPNS0_5dummyEE4typeE[boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type)]+0x58): undefined reference to `_imp___ZN5boost6thread12start_threadEv'
collect2: ld returned 1 exit status

Но я на 99,999% уверен, что связываю библиотеку нитей Boost.Он не пропущен, так как другой код, который использует его ссылки, хорошо.Функция execute_ThreadRefencing_test () вызывается из main () и имеет внешнюю связь, как указано в main.cpp.Как связать программу, если флаг -lboost_thread с MinGW-w64 работает только частично для программы?:( У меня даже есть два других похожих рекурсивных шаблона в программе, и они отлично связываются.

...