C++ 将Makefile项目转换为Cmake

C++ 将Makefile项目转换为Cmake,c++,makefile,cmake,C++,Makefile,Cmake,我正在学习如何在这个类中使用cmake,但是文档非常冗长和密集。很多教程要么太简单而不实用(cmake只有一个文件),要么太复杂 项目的原始生成文件如下所示: # 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-neare

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

项目的原始生成文件如下所示:

# 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 
这个项目是这样组织的

  • 克玛克勒恩
    • CMakeLists.txt
    • 建造
    • src
      • CMakeLists.txt
      • ParseRecord.hpp
      • 计时.cpp
      • small.dat
      • 生成文件
      • 分拣机
      • 正时
      • 实用程序模板.hpp
      • ParseRecord.cpp
      • 分拣机
      • 问题2.cpp
到目前为止,从我所做的阅读中,我了解到每个目录中都需要一个CMakelists.txt文件。 构建文件夹就在那里,这样我就可以进入其中并运行cmake

在顶级的CMakelists.txt文件中

cmake_minimum_required (VERSION 2.6)
project (CMAKETEST)
add_subdirectory(src)
在src dir 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 无论如何你只需要知道太多独立的、武断的事情。在 至少这是我的印象。例如,“添加定义(-std=c99)”。真正地 这个名字会让你想到如何向编译器添加标志吗?及 “集合(VAR a b c)”比VAR=a b c或类似的更直观吗? 在这篇文章上,在CMake上。但我知道CMake正在采取行动 风暴造世界

不过,我真的很想了解和弄明白这一点,所以你能提供的任何帮助都将非常感激和有用。提前感谢。

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

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

您不必在每个子目录中创建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应该可以完成这项工作。

谢谢,取得了一些进展,但我发现一个错误,关于prob2有一个问题。上面说找不到图书馆。所以我猜我必须以某种方式将库与cmake链接起来。我尝试了TARGET_LINK_库(prob2 timing.hpp)但没有效果。@harrisonguyen它应该是
\include
而不是
。对不起,这就是我的意思<代码>[25%]生成CXX对象CMakeFiles/hw1_p2.dir/src/prob2.cpp.o/Users/harrison/Documents/cmake/src/prob2.cpp:14:10:致命错误:“未找到scottgs/Timing.hpp”文件#包含^1生成的错误。make[2]:***[CMakeFiles/hw1_p2.dir/src/prob2.cpp.o]错误1 make[1]:***[CMakeFiles/hw1_p2.dir/all]错误2 make:**[all]错误2我将其更改为prob2.cpp中的#include“Timing.hpp”,它似乎正在工作。比makefile短得多,同时适用于许多平台。