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