Boost1.58—— thread组件使用说明

本文介绍了一个使用Boost库创建线程的C++示例,并详细记录了编译过程中遇到的错误及解决方法。通过逐步添加编译链接选项,最终成功编译并运行程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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/)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值