CMake undefined reference to `pthread_create` in Github Action Ubuntu image

CMake undefined reference to `pthread_create` in Github Action Ubuntu image

当我在使用Github动作CI的时候,发现无论用什么方法link,都没有办法linkpthread_create

但是这个错误只出现在Ubuntu环境,Windows,macOS都没有问题

我试过了:

  1. 不工作

    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. 不工作

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

编译后的日志可以在这里查看:

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

如果您仔细阅读构建日志

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

您注意到在链接位于目录 test 和 CMakeLists.txt 中的目标 GenerateAudioModelTest 时发生了错误,那里没有您显示的编译器标志。只需在 test/CMakeLists.txt.

中添加 -pthread

这是个坏主意。

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

使用

target_compile_options(GenerateAudioModelTest PRIVATE -pthread)

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

  1. Not Working

没有 link Thread::Thread 也没有目标 link 的任何库。

https://github.com/YuzukiTsuru/lessampler/blob/a6bb7e7d7ac30b6b4043d4f717a2d4deb7fb7638/test/CMakeLists.txt#L22

  1. Not Working

必须在 add_executable 之前设置标志。这意味着 所有 add_subdirectories 之前。标志具有目录范围。使用 targe_compile_options.

https://github.com/YuzukiTsuru/lessampler/blob/master/src/CMakeLists.txt

  1. 考虑把它做成一个库,为什么每个目录中有那么多,那么多 CMakeLists.txt。如果这些工具不是那么独立并且您永远不会单独使用它们,只需将它与一个 CMakeLists.txt 和 link 与所有库一起使用。