1、系统环境Ubuntu14.04 LTS g++-4.8
2、示例代码example.cpp
#include <boost/thread.hpp>
#include <iostream>
void task1()
{
// do stuff
std::cout << "This is task1!" << std::endl;
}
void task2()
{
// do stuff
std::cout << "This is task2!" << std::endl;
}
int main (int argc, char ** argv)
{
using namespace boost;
thread thread_1 = thread(task1);
thread thread_2 = thread(task2);
// do other stuff
thread_2.join();
thread_1.join();
return 0;
}
说明:BOOST库大多数组件不需要编译链接,直接在自己的源码里包含相应头文件夹即可。但少量库(如chrono、date_time、regex、program_options、thread、python等),必须编译成静态库或者动态库,并在构建时指定链接选项才能使用。
见如下三个执行命令:
$g++ example.cpp -o example
提示以下错误:
/tmp/ccU7kjwg.o:在函数‘__static_initialization_and_destruction_0(int, int)’中:
example.cpp:(.text+0x1be):对‘boost::system::generic_category()’未定义的引用
example.cpp:(.text+0x1ca):对‘boost::system::generic_category()’未定义的引用
example.cpp:(.text+0x1d6):对‘boost::system::system_category()’未定义的引用
/tmp/ccU7kjwg.o:在函数‘boost::thread_exception::thread_exception(int, char const*)’中:
example.cpp:(.text._ZN5boost16thread_exceptionC2EiPKc[_ZN5boost16thread_exceptionC5EiPKc]+0x14):对‘boost::system::system_category()’未定义的引用
/tmp/ccU7kjwg.o:在函数‘boost::detail::thread_data_base::thread_data_base()’中:
example.cpp:(.text._ZN5boost6detail16thread_data_baseC2Ev[_ZN5boost6detail16thread_data_baseC5Ev]+0x24):对‘vtable for boost::detail::thread_data_base’未定义的引用
/tmp/ccU7kjwg.o:在函数‘boost::thread::start_thread()’中:
example.cpp:(.text._ZN5boost6thread12start_threadEv[_ZN5boost6thread12start_threadEv]+0x15):对‘boost::thread::start_thread_noexcept()’未定义的引用
/tmp/ccU7kjwg.o:在函数‘boost::thread::~thread()’中:
example.cpp:(.text._ZN5boost6threadD2Ev[_ZN5boost6threadD5Ev]+0x15):对‘boost::thread::detach()’未定义的引用
/tmp/ccU7kjwg.o:在函数‘boost::thread::get_id() const’中:
example.cpp:(.text._ZNK5boost6thread6get_idEv[_ZNK5boost6thread6get_idEv]+0x18):对‘boost::thread::native_handle()’未定义的引用
/tmp/ccU7kjwg.o:在函数‘boost::thread::join()’中:
example.cpp:(.text._ZN5boost6thread4joinEv[_ZN5boost6thread4joinEv]+0x6d):对‘boost::thread::join_noexcept()’未定义的引用
/tmp/ccU7kjwg.o:在函数‘boost::detail::thread_data<void (*)()>::~thread_data()’中:
example.cpp:(.text._ZN5boost6detail11thread_dataIPFvvEED2Ev[_ZN5boost6detail11thread_dataIPFvvEED5Ev]+0x1f):对‘boost::detail::thread_data_base::~thread_data_base()’未定义的引用
/tmp/ccU7kjwg.o:(.rodata._ZTIN5boost6detail11thread_dataIPFvvEEE[_ZTIN5boost6detail11thread_dataIPFvvEEE]+0x10):对‘typeinfo for boost::detail::thread_data_base’未定义的引用
collect2: error: ld returned 1 exit status
lu@lu-PC:~/Test$ g++ -I/usr/local/inlcude -L/usr/local/lib example.cpp -lboost_thread -o example
/usr/bin/ld: /tmp/ccCiC4xs.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/local/lib/libboost_system.so.1.58.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
lu@lu-PC:~/Test$ clear
lu@lu-PC:~/Test$ g++ example.cpp -o example
/tmp/ccOjo0iv.o:在函数‘__static_initialization_and_destruction_0(int, int)’中:
example.cpp:(.text+0x1be):对‘boost::system::generic_category()’未定义的引用
example.cpp:(.text+0x1ca):对‘boost::system::generic_category()’未定义的引用
example.cpp:(.text+0x1d6):对‘boost::system::system_category()’未定义的引用
/tmp/ccOjo0iv.o:在函数‘boost::thread_exception::thread_exception(int, char const*)’中:
example.cpp:(.text._ZN5boost16thread_exceptionC2EiPKc[_ZN5boost16thread_exceptionC5EiPKc]+0x14):对‘boost::system::system_category()’未定义的引用
/tmp/ccOjo0iv.o:在函数‘boost::detail::thread_data_base::thread_data_base()’中:
example.cpp:(.text._ZN5boost6detail16thread_data_baseC2Ev[_ZN5boost6detail16thread_data_baseC5Ev]+0x24):对‘vtable for boost::detail::thread_data_base’未定义的引用
/tmp/ccOjo0iv.o:在函数‘boost::thread::start_thread()’中:
example.cpp:(.text._ZN5boost6thread12start_threadEv[_ZN5boost6thread12start_threadEv]+0x15):对‘boost::thread::start_thread_noexcept()’未定义的引用
/tmp/ccOjo0iv.o:在函数‘boost::thread::~thread()’中:
example.cpp:(.text._ZN5boost6threadD2Ev[_ZN5boost6threadD5Ev]+0x15):对‘boost::thread::detach()’未定义的引用
/tmp/ccOjo0iv.o:在函数‘boost::thread::get_id() const’中:
example.cpp:(.text._ZNK5boost6thread6get_idEv[_ZNK5boost6thread6get_idEv]+0x18):对‘boost::thread::native_handle()’未定义的引用
/tmp/ccOjo0iv.o:在函数‘boost::thread::join()’中:
example.cpp:(.text._ZN5boost6thread4joinEv[_ZN5boost6thread4joinEv]+0x6d):对‘boost::thread::join_noexcept()’未定义的引用
/tmp/ccOjo0iv.o:在函数‘boost::detail::thread_data<void (*)()>::~thread_data()’中:
example.cpp:(.text._ZN5boost6detail11thread_dataIPFvvEED2Ev[_ZN5boost6detail11thread_dataIPFvvEED5Ev]+0x1f):对‘boost::detail::thread_data_base::~thread_data_base()’未定义的引用
/tmp/ccOjo0iv.o:(.rodata._ZTIN5boost6detail11thread_dataIPFvvEEE[_ZTIN5boost6detail11thread_dataIPFvvEEE]+0x10):对‘typeinfo for boost::detail::thread_data_base’未定义的引用
collect2: error: ld returned 1 exit status
添加-I -L -l选项,(注-l后紧跟的库名libboost_thread.a,去除了前面的lib以及.a)
$g++ -I/usr/local/inlcude -L/usr/local/lib example.cpp -lboost_thread -o example
提示以下错误:
/usr/bin/ld: /tmp/ccOLD25b.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/local/lib/libboost_system.so.1.58.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
3、添加-lboost_system
$g++ -I/usr/local/inlcude -L/usr/local/lib example.cpp -lboost_thread -o example -lboost_system
*.a 属于静态库,编译时用。编译时,要找到.a文件,对于QT调试而言,要将存放.a文件的路径放到pro文件中,比如 LIBS+=-L/usr/local/lib,同时将库名(也可全称)加到LIBS中,比如LIBS +=
-lboost_program_options,一定要把boost_program_options前面的lib去掉,不然会提示找不到该库文件。
*.so 属于动态库,运行时用。运行时,关键是能找到对应的.dll或.so文件,在windows下,此时要么将.dll文件放到可执行文件目录下,要么在环境变量PATH中将.dll文件所在路径加进去。在linux下,则要将.so文件所在的目录加入到环境变量LD_LIBRARY_PATH路径中去(或放到那些公用库目录下,比如/usr/lib/)