c++ - 我必须运行 cmake 两次才能编译项目

标签 c++ multithreading makefile cmake pthreads

第一次运行命令时出现以下错误

cmake .

但是如果我再次运行该命令,编译就会成功。也就是说,我必须运行 cmake 两次 才能编译项目。为什么会这样呢?我该如何解决它?

错误消息:

CMakeFiles/exec.dir/Timer.cpp.o: In function `std::thread::thread<Timer::Timer()::{lambda()#1}>(Timer::Timer()::{lambda()#1}&&)':
/usr/include/c++/7/thread:122: undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status
CMakeFiles/exe.dir/build.make:146: recipe for target 'exe' failed
make[2]: *** [exe] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/exe.dir/all' failed
make[1]: *** [CMakeFiles/exe.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)

set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -g -std=c++14 -std=c++11 -std=c++17 ")

project(myproject)

set(SOURCE_FILES main.cpp Timer.cpp TimerEntity.cpp)
add_executable(exe ${SOURCE_FILES})

最佳答案

通常不会注意到,但通过附加编译器标志

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} <...>")

应放置在 project() 调用之后

正是 project() 调用设置了 CMAKE_CXX_FLAGS 变量的初始值。

通常,project() 调用是在 cmake_minimum_required() 之后发出的:

cmake_minimum_required(VERSION 3.10)
project(437_Hw1)

...

详细信息

在当前代码中,当您第一次调用 cmake 时,您的第一个设置 set(CMAKE_CXX_FLAGS ...) 将替换为以下 的值>project() 调用并存储在 CACHE 中。

当您第二次调用 cmake 时,CMAKE_CXX_FLAGS 变量已设置(它是从缓存加载的)。因此,set(CMAKE_CXX_FLAGS ...) 将变量设置为正确的值。此外,以下 project() 不会更改 CMAKE_CXX_FLAGS 变量,因为它发现它已经在缓存中。

关于c++ - 我必须运行 cmake 两次才能编译项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58949404/

相关文章:

c++ - 不使用嵌套的 if 语句只打印改变的值

c++ - QT 5 64 位适用于 Windows 和 VS2010

c++ - <vector> 在不同位置读/写是线程安全的吗?

c++ - C++ 类是否解决了函数覆盖问题?

linux - 在 CC/GCC 构建期间, 'make' 是否未输出 "redirecting incorrect #include"警告?

c++ - 如何为每个周期建立 boost

c++ - C++中的数字计数器

C# WPF 应用程序随时间卡住

ruby - 如何在 osx 上使用调试符号从源代码编译 ruby​​?

c++ - 基于使用 make 命令或 makefile 运行预处理器