将Makefile项目转换为Cmake

Har*_*son 15 c++ makefile cmake

我正在学习如何使用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 
Run Code Online (Sandbox Code Playgroud)

该项目的组织方式如下

  • cmakelearn
    • 的CMakeLists.txt
    • 建立
    • SRC
      • 的CMakeLists.txt
      • ParseRecord.hpp
      • Timing.cpp
      • small.dat
      • Makefile文件
      • Sorter.cpp
      • Timing.hpp
      • utility_templates.hpp
      • ParseRecord.cpp
      • Sorter.hpp
      • prob2.cpp

到目前为止,从我已经完成的阅读中我了解到每个目录中都需要一个CMakelists.txt文件.构建文件夹在那里,以便我可以进入它并运行cmake ..

在我的顶级CMakelists.txt文件中

cmake_minimum_required (VERSION 2.6)
project (CMAKETEST)
add_subdirectory(src)
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)

我甚至不知道从哪里开始.这个教程的评论几乎总结了我对cmake和文档的看法:

不够详细,不够有用.话虽如此,我还是不喜欢CMake; 你需要知道的太多独立,随意的事情.至少这是我的印象.比如'add_definitions(-std = c99)'.真?这个名称是否会向您推断如何向编译器添加标志?并且"设置(VAR abc)"比VAR = abc或某些更直观吗?Beh在文章上,在CMake上.但我知道CMake正在风暴中占据构建世界.

尽管如此,我真的很想学习并弄清楚这一点,所以你能提供的任何帮助都会非常感激和乐于助人.提前致谢.

Dav*_*own 6

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

add_executable(hw1_p2 prob2.cpp ParseRecord.cpp Sorter.cpp Timing.cpp)
Run Code Online (Sandbox Code Playgroud)


use*_*078 5

您不必在每个子目录中都创建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)
Run Code Online (Sandbox Code Playgroud)

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