【问题标题】:Converting a Makefile project to Cmake将 Makefile 项目转换为 Cmake
【发布时间】:2013-09-11 22:09:51
【问题描述】:

我正在学习如何在本课程中使用 cmake,但文档非常冗长和密集。很多教程要么太简单而无用(cmake 只有一个文件),要么太复杂。

项目的原始 Makefile 如下所示:

# Some optimization settings
# see: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

# Standard all target
all: hw1_p2

# Simple program to do brute-force k-nearest neighbor searches against a signature file
hw1_p2: prob2.o ParseRecord.o Sorter.o Timing.o
        g++ -o hw1_p2 prob2.o ParseRecord.o Sorter.o Timing.o

prob2.o: prob2.cpp utility_templates.hpp
        g++ -Wall -c prob2.cpp

ParseRecord.o: ParseRecord.cpp ParseRecord.hpp utility_templates.hpp
        g++ -Wall -c ParseRecord.cpp

Sorter.o: Sorter.cpp Sorter.hpp
        g++ -Wall -c Sorter.cpp

# Timing class
Timing.o: Timing.hpp Timing.cpp
        g++ -Wall -c Timing.cpp

# Clean code-derived files
clean:
        rm -f *.o hw1_p2 

项目是这样组织的

  • cmakelearn
    • CMakeLists.txt
    • 构建
      • CMakeLists.txt
      • ParseRecord.hpp
      • Timing.cpp
      • small.dat
      • 生成文件
      • 分拣机.cpp
      • Timing.hpp
      • utility_templates.hpp
      • ParseRecord.cpp
      • 分拣机.hpp
      • prob2.cpp

到目前为止,根据我所做的阅读,我了解到每个目录中都需要一个 CMakelists.txt 文件。 build 文件夹就在那里,这样我就可以进入它并运行 cmake ..

在我的顶级 CMakelists.txt 文件中

cmake_minimum_required (VERSION 2.6)
project (CMAKETEST)
add_subdirectory(src)

在 src 目录 CMakelist.txt 这是我的尝试:

include_directories(${CMAKETEST_SOURCE_DIR}/src)
link_directories(${CMAKETEST_BINARY_DIR}/src)

add_executable(hw1_p2 prob2.cpp ParseRecord.cpp Sorter.cpp Timing.cpp)

除此之外,我什至不知道从哪里开始。 教程中的这条评论几乎总结了我现在对 cmake 和文档的想法:

不够详细,无法使用。话虽如此,我不太喜欢 CMake 反正;你必须知道的太多独立的、任意的事情。在 至少这是我的印象。比如,‘add_definitions(-std=c99)’。真的吗? 该名称是否会突然出现在您如何向编译器中添加标志时?和 'set(VAR a b c)' 是否比 VAR=a b c 或类似的更直观? Beh 在文章和 CMake 上。然而我知道 CMake 正在采取 狂风暴雨般的构建世界。

不过,我真的很想学习并弄清楚这一点,因此您可以提供的任何帮助都将不胜感激。提前致谢。

【问题讨论】:

    标签: c++ makefile cmake


    【解决方案1】:

    您不必在每个子目录中创建 cmakelists.txt 文件。对于一个如此简单的项目,将所有内容放入顶层 cmakelists.txt 就足够了

    cmake_minimum_required (VERSION 2.6)
    project (CMAKETEST C CXX)
    
    add_executable(hw1_p2 src/prob2.cpp src/ParseRecord.cpp src/Sorter.cpp src/Timing.cpp)
    

    这个简单的 cmakelists.txt 应该可以完成工作。

    【讨论】:

    • 比makefile短得多,同时适用于很多平台。
    【解决方案2】:

    add_executable 命令用于构建可执行文件,但您似乎也在尝试使用它来构建对象 (.o) 文件。由于您只构建一个可执行文件,因此您只需要一个 add_executable 命令:

    add_executable(hw1_p2 prob2.cpp ParseRecord.cpp Sorter.cpp Timing.cpp)
    

    【讨论】:

    • 谢谢,取得了一些进展,但我收到一个关于 prob2 包含 的错误。它说找不到库。所以我猜我必须以某种方式将库与 cmake 链接起来。我试过 TARGET_LINK_LIBRARIES(prob2 timing.hpp) 无济于事。
    • @HarrisonNguyen 应该是 #include <Timing.hpp> 而不是 <#include Timing.hpp>
    • 对不起,我就是这个意思。 [ 25%] Building CXX object CMakeFiles/hw1_p2.dir/src/prob2.cpp.o /Users/harrison/Documents/cmake/src/prob2.cpp:14:10: fatal error: 'scottgs/Timing.hpp' file not found #include <scottgs/Timing.hpp> ^ 1 error generated. make[2]: *** [CMakeFiles/hw1_p2.dir/src/prob2.cpp.o] Error 1 make[1]: *** [CMakeFiles/hw1_p2.dir/all] Error 2 make: *** [all] Error 2
    • 我在 prob2.cpp 中将其更改为 #include "Timing.hpp",它似乎可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2017-02-10
    相关资源
    最近更新 更多