ライブラリをビルドせずにBoost.Threadを使う

Boost.Systemがソースファイルをインクルードしてたので、参考にして書いてみた。


boost_thread_header_only.hpp

#ifndef HEADER_ONLY_BOOST_THREAD_INCLUDE
#define HEADER_ONLY_BOOST_THREAD_INCLUDE

#ifndef BOOST_ERROR_CODE_HEADER_ONLY
#define BOOST_ERROR_CODE_HEADER_ONLY
#endif

#ifndef BOOST_THREAD_NO_LIB
#define BOOST_THREAD_NO_LIB
#endif

#ifndef BOOST_DATE_TIME_NO_LIB
#define BOOST_DATE_TIME_NO_LIB
#endif

#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>

#if defined(BOOST_THREAD_HEADER_ONLY_NO_DLL)
    #if defined(BOOST_HAS_DECLSPEC)
        #undef BOOST_HAS_DECLSPEC
    #endif
#endif

#include <boost/thread.hpp>

#if defined(BOOST_THREAD_PLATFORM_WIN32)
    #include <boost/../libs/thread/src/win32/timeconv.inl>
    #include <boost/../libs/thread/src/win32/thread.cpp>
    #include <boost/../libs/thread/src/win32/tss_dll.cpp>
    #include <boost/../libs/thread/src/win32/tss_pe.cpp>
#else
//  #include <boost/../libs/thread/src/pthread/timeconv.inl> // DateTime周りで再定義エラーになるので怪しい
    #include <boost/../libs/thread/src/pthread/once.cpp>
    #include <boost/../libs/thread/src/pthread/thread.cpp>
#endif

namespace boost {
void tss_cleanup_implemented() {}
}

#endif // HEADER_ONLY_BOOST_THREAD_INCLUDE
#include "boost_thread_header_only.hpp"
#include <iostream>

void hello() { std::cout << "Hello" << std::endl; }

int main()
{
    boost::thread t(hello);
    t.join();
}
Hello

sleepとか使う場合は、Boost.DateTimeもまじめに対応する必要がありますが今回はDateTimeは対応してません。
これだけあれば、Boost.Asioもヘッダのみで使用できる気がしますが、まだ検証していません。


あと、このコードには後方互換性なんてものはないので、Boost 1.44.0以外で動くかどうかも不明です。取り扱い注意。


修正履歴:
2010/12/16 10:40 : WindowsでコンパイルされたGCC用にBOOST_THREAD_HEADER_ONLY_NO_DLLを追加。