Преобразование проекта 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 

Проект организован таким образом

  • cmakelearn
    • CMakeLists.txt
    • build
    • ЦСИ
      • 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)

и в 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 так или иначе; слишком много отдельных, произвольных вещей, которые вам просто нужно знать. В по крайней мере, это мое впечатление. Например: add_definitions (-std = c99). В самом деле? Вызывает ли это имя на вас, как добавить флаги в компилятор? А также (VAR a b c) более интуитивно понятный, чем VAR = a b c или некоторые такие? Бег по статье, и на CMake. Тем не менее я знаю, что CMake принимает строить мир штурмом.

Тем не менее, я действительно хочу научиться и понять это, поэтому любая помощь, которую вы можете предоставить, будет очень признательна и полезна. Спасибо заранее.

Ответ 1

Команда add_executable предназначена для создания исполняемых файлов, но вы, похоже, пытаетесь использовать ее для создания файлов объектов (.o) также. Поскольку вы создаете только один исполняемый файл, вам нужна только одна команда add_executable:

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

Ответ 2

Вам не нужно создавать файлы 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 должен выполнить свою работу.

Ответ 3

Clion может создать файл CMakeLists.txt для вас.
После этого вам нужно будет добавить зависимости Find_Package.