关于c++链接pthread的问题

在ubuntu20.04/gcc环境下
在编译该页面的代码时候
https://zh.cppreference.com/w/cpp/thread/packaged_task
发现在尚未编写(而不是定义了但未调用,严谨一点是关于std::thread声明与否)void task_thread()的时候,运行时候会报错

terminate called after throwing an instance of 'std::system_error'
  what():  Unknown error -1

cmake是这样写的

cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(PROJECT_NAME "packaged_task_test")
set(CMAKE_CXX_FLAGS "-g")# 断点无效处理方案
project(${PROJECT_NAME})

include_directories()
link_directories()
# aux_source_directory(. SOURCE)
file(GLOB_RECURSE SRC "${CMAKE_SOURCE_DIR}/src/*")
add_executable(${PROJECT_NAME}${SRC})
# 链接库
target_link_libraries(${PROJECT_NAME} pthread)

问题描述

在使用future库的时候,若不定义std::thread,运行时候就会报错。这时候其实就会想到是不是在链接的时候并没有将线程库给链接到可执行程序上,因为如果定义了一个std::thread,无论使用与否,使用future库的时候是不会在运行时报错的。

解决问题

1.初步解决
在解决问题的时候,发现了一些端倪
https://stackoverflow.com/questions/65335620/terminate-called-after-throwing-an-instance-of-stdsystem-error
从该问题的回答中大概了解到,问题提出者也是缺少链接pthread而造成的问题。那么问题就清晰了,其实在代码中定义一个std::thread t([](){});,这样做的目的就是在指引编译器去强制链接上pthread,为future库提供前置条件(也许是这样),就可以完美解决问题了

2.深入解决
但是问题的根源是在编译链接的时候,并没有把pthread库给加进来,如何解决这个问题?
关注下面回答的最后一句话
https://stackoverflow.com/questions/23250863/difference-between-pthread-and-lpthread-while-compiling/62561519#62561519


The above makes it clear why -lpthread is neither necessary nor sufficient.
//翻译过来就是:-lpthread既不必要也不充分

那么通过修改编译指令解决问题(如何修改可见上述链接的回答,大概就是在编译命令中将-lpthread改为-pthread)
重新修改cmake链接的指令(最后一句)即可完美解决问题

....
# 链接库
# 原先需要在代码中手动添加std::thread的编译指令如下
# target_link_libraries(${PROJECT_NAME} pthread)
# 以上编译指令等价于下面这条
# target_link_libraries(${PROJECT_NAME} "-lpthread")
# 这条没被注释的是可
target_link_libraries(${PROJECT_NAME} "-pthread")
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值