【问题标题】:I have to run cmake twice for compile the project我必须运行 cmake 两次才能编译项目
【发布时间】:2019-11-20 08:03:51
【问题描述】:

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

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})

【问题讨论】:

标签: c++ multithreading makefile cmake pthreads


【解决方案1】:

通常不注明,但通过附加编译器标志

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 变量,因为它发现它已经在缓存中。

【讨论】:

  • 谢谢我知道了。
【解决方案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)

【讨论】:

    【解决方案3】:

    我建议你换行

    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)
    

    看看有没有帮助。

    【讨论】:

    • 谢谢,这行得通。但是如果我写'pthread'。我可以在windows pc上工作吗?
    • pthread 库也安装在大多数 linux 发行版上,可能也安装在 mac 上。
    • 你在说。我不能在 Windows 上使用?那么,我该如何使用线程?如果我在 ubuntu 中编写,那么为了在 Windows 上工作。
    • 那么你需要一个windows线程库的封装接口。您可以使用 Windows API 编写自己的 API,或者最好使用已经存在的 API,例如 boost 或 qt。
    • @herrobee1965 使用 std::thread(C++11 标准及更高版本的一部分)而不是 pthread(实现线程的 Unix 库)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多