次のコードをリンクしようとしたときに問題が発生しました: 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();
}
結果はやや不可解なリンカ エラーですが、「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% 確信しています。それを使用する他のコードが正常にリンクするため、欠落していません。execute_ThreadRefencing_test() 関数は main() から呼び出され、main.cpp で宣言されているように外部リンケージがあります。MinGW-w64 への -lboost_thread フラグがプログラムに対して部分的にしか機能しない場合、プログラムをリンクするにはどうすればよいですか? :(プログラムには他にも2つの同様の再帰テンプレートのインスタレーションがあり、それらはうまくリンクしています。