Skip to content

Instantly share code, notes, and snippets.

@hackallcode
Last active October 6, 2017 20:13
Show Gist options
  • Save hackallcode/ff06f7f59dc8297e282a7397e2ac375d to your computer and use it in GitHub Desktop.
Save hackallcode/ff06f7f59dc8297e282a7397e2ac375d to your computer and use it in GitHub Desktop.
lab04

Laboratory work IV

Данная лабораторная работа посвещена изучению систем автоматизации сборки проекта на примере CMake

$ open https://cmake.org/

Tasks

  • 1. Создать публичный репозиторий с названием lab04 на сервисе GitHub
  • 2. Ознакомиться со ссылками учебного материала
  • 3. Выполнить инструкцию учебного материала
  • 4. Составить отчет и отправить ссылку личным сообщением в Slack

Tutorial

$ export GITHUB_USERNAME=<имя_пользователя>

Клонируем файлы из lab03

$ git clone https://github.com/${GITHUB_USERNAME}/lab03.git lab04
$ cd lab04
$ git remote remove origin # Удаление ссылки на репозиторий
$ git remote add origin https://github.com/${GITHUB_USERNAME}/lab04.git # Добавление новой

Компилим

$ g++ -I./include -std=c++11 -c sources/print.cpp # Компилим print.cpp
$ ls print.o # Проверяем, скомпилился ли объектный файл
$ ar rvs print.a print.o # Aрхивируем объектный файл и создаем статическую библиотеку
$ file print.a # Получаем информацию о файле
$ g++ -I./include -std=c++11 -c examples/example1.cpp
$ ls example1.o
$ g++ example1.o print.a -o example1 # Собираем с учетом библиотеки print.a
$ ./example1 && echo # Вывдим результат выполнения

Ещё раз

$ g++ -I./include -std=c++11 -c examples/example2.cpp
$ ls example2.o
$ g++ example2.o print.a -o example2
$ ./example2
$ cat log.txt && echo

Удаление объектных и статических файлов

$ rm -rf example1.o example2.o print.o 
$ rm -rf print.a 
$ rm -rf example1 example2
$ rm -rf log.txt

Создаем СMakeList, указываем минимальную версию и название проекта

$ cat > CMakeLists.txt <<EOF
cmake_minimum_required(VERSION 3.0)
project(print)
EOF

Указываем стандарт и запрещаем менять его

$ cat >> CMakeLists.txt <<EOF
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
EOF

Добавляем библиотеку

$ cat >> CMakeLists.txt <<EOF
add_library(print STATIC \${CMAKE_CURRENT_SOURCE_DIR}/sources/print.cpp)
EOF

Папка заголовочных файлов

$ cat >> CMakeLists.txt <<EOF
include_directories(\${CMAKE_CURRENT_SOURCE_DIR}/include)
EOF

Запускаем сборку

$ cmake -H. -B_build
$ cmake --build _build

Указываем исполняемые файлы

$ cat >> CMakeLists.txt <<EOF

add_executable(example1 \${CMAKE_CURRENT_SOURCE_DIR}/examples/example1.cpp)
add_executable(example2 \${CMAKE_CURRENT_SOURCE_DIR}/examples/example2.cpp)
EOF

Линкуем библиотеки

$ cat >> CMakeLists.txt <<EOF

target_link_libraries(example1 print)
target_link_libraries(example2 print)
EOF

Компилируем

$ cmake --build _build
$ cmake --build _build --target print
$ cmake --build _build --target example1
$ cmake --build _build --target example2

Проверяем выполнение

$ ls -la _build/libprint.a
$ _build/example1 && echo
hello
$ _build/example2
$ cat log.txt && echo
hello

Берем Ваш CMakeLists (???)

$ git clone https://github.com/tp-labs/lab04 tmp
$ mv -f tmp/CMakeLists.txt .
$ rm -rf tmp

$ cat CMakeLists.txt
$ cmake -H. -B_build -DCMAKE_INSTALL_PREFIX=_install # Задаем целевую директорию 
$ cmake --build _build --target install 
$ tree _install # Выводим информацию о системе

Заливаем

$ git add CMakeLists.txt
$ git commit -m"added CMakeLists.txt"
$ git push origin master

Report

$ cd ~/workspace/labs/
$ export LAB_NUMBER=04
$ git clone https://github.com/tp-labs/lab${LAB_NUMBER} tasks/lab${LAB_NUMBER}
$ mkdir reports/lab${LAB_NUMBER}
$ cp tasks/lab${LAB_NUMBER}/README.md reports/lab${LAB_NUMBER}/REPORT.md
$ cd reports/lab${LAB_NUMBER}
$ edit REPORT.md
$ gistup -m "lab${LAB_NUMBER}"

Links

Copyright (c) 2017 Братья Вершинины
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment