最近在做 linux 环境下编程时发现,在使用 C++ 11 中的线程类std::thread时,出现了下面的错误,这里做个笔记记录下。

demo 代码:

#include<iostream>
#include<thread>
using namespace std;
void func(){
    cout<<"llalal"<<endl;
}
int main(void){
    thread mthd(func);
    mthd.join();
    return 0;
}

编译脚本:

g++ main.cpp -o main

编译错误 :

/usr/bin/ld: /tmp/ccNLJ5jG.o: in function `std::thread::thread<void (&)(), , void>(void (&)())':
/usr/include/c++/9/thread:126: undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status

问题分析: pthread不是linux下的默认的库,也就是在链接的时候,无法找到phread库中join函数的入口地址,于是链接会失败。

解决方案: 编译命令后,附加 -lpthread 参数。(-l是L是小写 不是i的大写I)

修改后(正确)的编译脚本:

g++ -std=c++11 main.cpp -o mainn -lpthread

编译后执行:

linzhuofan@ubuntu:~/Desktop/duoxianchen$ ./mainn 
llalal

        但是,其实,C++11引入的thread库已经对linux下的pthread库进行了封装,在linxu下只需要这么写CMakeLists.txt即可把所有的多线程代码都跑起来!!!

CMakeLists.txt:

cmake_minimum_required(VERSION 3.1.0)
project(ProjectName)#ProjectName 需要你自己取项目名字!

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall ")
set(CMAKE_BUILD_TYPE Debug)
include_directories(${CMAKE_SOURCE_DIR}/include)
file(GLOB SRC_FILES    #注意这里定义都shell 变量 SRC_FILES 一定要对应在add_executable中!
    "${PROJECT_SOURCE_DIR}/src/*.cpp"
)
#查找依赖库
find_package(Threads REQUIRED)
add_executable(${CMAKE_PROJECT_NAME} main.cpp ${SRC_FILES})
#引入依赖库
target_link_libraries(${CMAKE_PROJECT_NAME} Threads::Threads)

GitHub 加速计划 / li / linux-dash
13
2
下载
A beautiful web dashboard for Linux
最近提交(Master分支:4 个月前 )
186a802e added ecosystem file for PM2 5 年前
5def40a3 Add host customization support for the NodeJS version 5 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐