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

时间:2019-11-20 08:03:51

标签: 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})

3 个答案:

答案 0 :(得分:4)

通常不会注意到,而是通过以下方式附加编译器标志

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变量(它是从 cache 加载的)。因此,set(CMAKE_CXX_FLAGS ...)将变量设置为正确的值。此外,跟随project()不会更改CMAKE_CXX_FLAGS变量,因为它已在缓存中找到它。

答案 1 :(得分:2)

我重新制作了您的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)

答案 2 :(得分:1)

我建议您替换行

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

使用

set(CMAKE_CXX_STANDARD 17)
target_link_libraries(exe pthread)

看看是否有帮助。