C++ 我必须运行两次cmake来编译这个项目

C++ 我必须运行两次cmake来编译这个项目,c++,multithreading,makefile,cmake,pthreads,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

我在第一次运行命令时遇到以下错误

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
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} -pthread -g -std=c++14 -std=c++11 -std=c++17 ")


看看这是否有帮助。

通常不会注意到这一点,而是通过

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} <...>")
细节 在当前代码中,当您第一次调用
cmake
时,您的第一个设置
set(cmake\u CXX\u FLAGS…
将替换为以下
project()
调用的值,并存储在缓存中


第二次调用
cmake
时,
cmake\u CXX\u FLAGS
变量已设置(从缓存加载)。因此,
set(CMAKE\u CXX\u标志…
将变量设置为正确的值。此外,以下
project()
不会更改
CMAKE\u CXX\u FLAGS
变量,因为它发现它已经在缓存中。

我重新修改了您的CMakeLists.txt以使用现代的CMAKE:

cmake_minimum_required(VERSION 3.7)
project(437_Hw1)

# CMake can set the standard in a cross-platform way for you
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_BUILD_TYPE Debug)

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

# These two lines add the platform-specific magic for the right threading library/headers.
find_package(Threads)
target_link_libraries(exe Threads::Threads)

您确定-pthread应该在编译标志中吗?缺少的引用是链接时错误,外部库是编译到目标文件时的点。相关:。这个问题描述了在CMake中使用pthreads。谢谢,这很有效。但如果我写“pthread”。我可以在windows pc上工作吗?pthread库也安装在大多数linux发行版上,可能也安装在mac上。我不能在windows上使用?那么,我如何使用线程呢?如果我用ubuntu写,那么为了在windows上工作,你需要一个windows线程库的包装器接口。您可以使用windows API编写自己的API,或者最好使用已有的API,如boost或qt。@herobee1965使用
std::thread
(C++11标准及更高版本的一部分)而不是
pthread
(实现线程的Unix库),谢谢我的支持。
cmake_minimum_required(VERSION 3.10)
project(437_Hw1)

...
cmake_minimum_required(VERSION 3.7)
project(437_Hw1)

# CMake can set the standard in a cross-platform way for you
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_BUILD_TYPE Debug)

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

# These two lines add the platform-specific magic for the right threading library/headers.
find_package(Threads)
target_link_libraries(exe Threads::Threads)