最近在做 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)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐