Monday, July 11, 2022

[SOLVED] CMake undefined reference to `pthread_create` in Github Action Ubuntu image

Issue

When I was using Github Action CI, I found that no matter what method I used to link, there was no way to link pthread_create

But this error only appears in the Ubuntu environment, Windows, macOS are no problem

I tried:

  1. Not Working

    set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
    set(THREADS_PREFER_PTHREAD_FLAG TRUE)
    
    find_package(Threads REQUIRED)
    
    add_executable(xxx xxx.c)
    target_link_libraries(xxx PRIVATE Threads::Threads)
    
  2. Not Working

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")
    

You can view the compiled log here:

https://github.com/YuzukiTsuru/lessampler/runs/6640320037?check_suite_focus=true


Solution

If you read the build log carefully

/usr/bin/ld: CMakeFiles/GenerateAudioModelTest.dir/__/src/GenerateAudioModel.cpp.o: in function `GenerateAudioModel::GenerateModelFromFile()':
GenerateAudioModel.cpp:(.text+0x27aa): undefined reference to `pthread_create'

You notice the error has happened while linking the target GenerateAudioModelTest that is located in the directory test and CMakeLists.txt there does not have the compiler flags you shown. Just add -pthread in test/CMakeLists.txt.


This is a bad idea.

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")

Use

target_compile_options(GenerateAudioModelTest PRIVATE -pthread)

See What is the modern method for setting general compile flags in CMake?



Answered By - 273K
Answer Checked By - Marie Seifert (WPSolving Admin)