当使用多线程并进行编译的时候出现这个报错
/usr/bin/ld: CMakeFiles/yolov8_thread_pool.dir/src/yolov8_thread_pool.cpp.o: undefined reference to symbol 'pthread_create@@GLIBC_2.17'
/usr/bin/ld: /lib/aarch64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/yolov8_thread_pool.dir/build.make:120: yolov8_thread_pool] Error 1
make[1]: *** [CMakeFiles/Makefile2:206: CMakeFiles/yolov8_thread_pool.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
可以直接在CmakeLists.txt最后加入这两行
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
这两行的意思是
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
: 这一行设置了一个变量CMAKE_THREAD_LIBS_INIT
,其值为"-lpthread"
。这意味着当CMake配置项目时,它会设置使用POSIX线程库,即pthread。-lpthread
选项用于告诉链接器(linker)将pthread库链接到最终的可执行文件或库中。这通常在需要使用多线程编程时必须要做的配置。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
: 这一行向CMake变量CMAKE_CXX_FLAGS
添加了-pthread
标志。这个变量包含了传递给C++编译器的标志。-pthread
标志是GCC编译器用来编译多线程应用的,它不仅链接pthread库,还可能设置一些编译器级别的线程优化。将这个标志添加到CMAKE_CXX_FLAGS
确保了所有C++源文件在编译时都会考虑多线程支持。
总结来说,这两行CMake脚本确保了你的项目可以使用pthread库进行多线程编程,同时确保了编译器在编译时能够进行适当的设置来支持多线程。
然后重新make编译即可