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都没有问题
我试过了:
不工作
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)
不工作
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?
- Not Working
您没有 link Thread::Thread 也没有目标 link 的任何库。
- Not Working
必须在 add_executable
之前设置标志。这意味着 在 所有 add_subdirectories
之前。标志具有目录范围。使用 targe_compile_options
.
https://github.com/YuzukiTsuru/lessampler/blob/master/src/CMakeLists.txt
- 考虑把它做成一个库,为什么每个目录中有那么多,那么多 CMakeLists.txt。如果这些工具不是那么独立并且您永远不会单独使用它们,只需将它与一个 CMakeLists.txt 和 link 与所有库一起使用。
当我在使用Github动作CI的时候,发现无论用什么方法link,都没有办法linkpthread_create
但是这个错误只出现在Ubuntu环境,Windows,macOS都没有问题
我试过了:
不工作
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)
不工作
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?
- Not Working
您没有 link Thread::Thread 也没有目标 link 的任何库。
- Not Working
必须在 add_executable
之前设置标志。这意味着 在 所有 add_subdirectories
之前。标志具有目录范围。使用 targe_compile_options
.
https://github.com/YuzukiTsuru/lessampler/blob/master/src/CMakeLists.txt
- 考虑把它做成一个库,为什么每个目录中有那么多,那么多 CMakeLists.txt。如果这些工具不是那么独立并且您永远不会单独使用它们,只需将它与一个 CMakeLists.txt 和 link 与所有库一起使用。