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を追加。