undefined reference to `pthread_create' CLion

8

我正在尝试在Linux(Ubuntu)操作系统下使用CLion编译我的程序。

我的CMake文件:

# cmake_minimum_required(VERSION 3.5)
  project(untitled2 C)

  set(CMAKE_C_STANDARD 99)
  set(CMAKE_CXX_FLAGS -pthread)
  add_executable(untitled2 main.c)

我的程序使用了线程,所以我添加了set(CMAKE_CXX_FLAGS -pthread)来编译我的程序。

但是我得到了一个编译错误:“undefined reference to pthread_create”。

我可以通过终端编译程序,使用以下命令:

gcc main.c -o main -pthread

我觉得我的问题在于CMake文件。能否有人帮忙解决这个问题吗?
谢谢!

你还需要将 -pthread 参数传递给链接器(或者显式地使用 -lpthread 链接)。你可能想要了解一下[CMake的 FindThreads函数](https://cmake.org/cmake/help/latest/module/FindThreads.html)(尽管目前它已经离线,但根据他们的页面会很快恢复)。 - Some programmer dude
1
顺便提一下,CXX 任何东西都是针对 C++,而不是 C。 - Some programmer dude
谢谢您的回复。我将CXX更改为C,编译成功了! - Ido Segal
你如何设置要使用的C标准(即使它被CLion自动添加了)? 在你的CMakeLists.txt中,有一个非常简单的关于语言和相关变量的模式。 - Some programmer dude
3
可能是cmake和libpthread的重复问题。 - Tsyvarev
3个回答

9

您需要将 set(CMAKE_CXX_FLAGS -pthread) 改为 set(CMAKE_C_FLAGS -pthread),因为 CXX 代表 C++。希望这能帮到您。


7
我可能仍然不是最佳选项,但使用调用 find_package(Threads REQUIRED) 以及结合使用 target_link_libraries(mytarget PRIVATE Threads::Threads) 是更现代的实现目标方式,因为你应该在目标上执行操作(而不是使用可能影响项目其他部分甚至包含拼写问题的“神奇”变量)。
参见:https://codingnest.com/basic-cmake-part-2/

1

将以下内容添加到CMakeLists对我来说是有效的:

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(myprog Threads::Threads )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接