我必须 运行 cmake 两次才能编译项目
I have to run cmake twice for compile the project
我在第一个 运行 命令
中遇到以下错误
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} -pthread -g -std=c++14 -std=c++11 -std=c++17 ")
和
set(CMAKE_CXX_STANDARD 17)
target_link_libraries(exe pthread)
看看是否有帮助。
通常不会注意到,但通过
附加编译器标志
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()
调用的值替换并存储在 缓存.
当您第二次调用 cmake
时,CMAKE_CXX_FLAGS
变量已经设置(它是从 缓存 加载的)。因此,set(CMAKE_CXX_FLAGS ...)
将变量设置为正确的值。此外,跟随 project()
不会更改 CMAKE_CXX_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)
我在第一个 运行 命令
中遇到以下错误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} -pthread -g -std=c++14 -std=c++11 -std=c++17 ")
和
set(CMAKE_CXX_STANDARD 17)
target_link_libraries(exe pthread)
看看是否有帮助。
通常不会注意到,但通过
附加编译器标志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()
调用的值替换并存储在 缓存.
当您第二次调用 cmake
时,CMAKE_CXX_FLAGS
变量已经设置(它是从 缓存 加载的)。因此,set(CMAKE_CXX_FLAGS ...)
将变量设置为正确的值。此外,跟随 project()
不会更改 CMAKE_CXX_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)