C/C++ в Cygwin

Эта короткая заметка — о том, как начать программировать на языках C и C++ в среде Cygwin. Об установке Cygwin читайте тут.

Установка средств разработки

Чтобы начать программировать, вам понадобятся компиляторы соответствующих языков и отладчик; пригодится также утилита make. Поэтому запустите программу установки Cygwin (setup.exe) и в диалоге Select Packages выберите следующие пакеты из категории Devel:

  • gcc-core: GNU Compiler Collection (C, OpenMP)
  • gcc-g++: GNU Compiler Collection (C++)
  • gdb: The GNU debugger
  • make: The GNU version of the ‘make’ utility

Установите их, нажав кнопку Далее.

Создаем папки проектов

Я запустил Cygwin Terminal и создал в домашней директории две папки (clearning и cpplearning), куда буду помещать проекты на C и C++ соответственно:

mkdir clearning
mkdir cpplearning

В обеих папках я создал папку helloworld:

cd ~/clearning
mkdir helloworld
cd ~/cpplearning
mkdir helloworld

Пишем и компилируем программу на C

Я создаю в папке clearning/helloworld файл main.c:

cd ~/clearning/helloworld
touch main.c

Открываю main.c любым текстовым редактором и пишу в него следующий код:

#include <stdio.h>

int main()
{
    printf("Hello, World!");
    return 0;
}

Запускаю компилятор:

gcc -o hello.exe main.c

В результате в папке появляется исполняемый файл hello.exe, который я могу запустить:

./hello.exe

На экране я увижу строку Hello, World!
Подробную информацию об использовании компилятора gcc можно найти в книге Peter Prinz, Tony Crawford — C in a Nutshell The Definitive Reference, 2nd Edition — 2015 Chapter 19. Compiling with GCC.

Пишем и компилируем программу на C++

Я создаю в папке cpplearning/helloworld файл main.cpp:

cd ~/cpplearning/helloworld
touch main.cpp

Открываю main.cpp любым текстовым редактором и пишу в него следующий код:

#include <iostream>

int main()
{
    std::cout << "Hello, World!";
    return 0;
}

Запускаю компилятор:

g++ -o hello.exe main.cpp

В результате в папке появляется исполняемый файл hello.exe, который я могу запустить:

./hello.exe

На экране я увижу строку Hello, World!

cygwin1.dll —> PATH

Программы, которые вы копилируете в cygiwin автоматически линкуются с библиотекой cygwin1.dll. Библиотека эта, согласно оф. сайту «provides substantial POSIX API functionality», т. е. заменяет вашей программе POSIX’ные системные вызовы. Из командной строки cygwin вы можете запустить свою программу без проблем, а вот скажем из проводника Windows или из командной строки cmd.exe у вас ее запустить просто так не получится — Windows не сможет найти библитеку cygwin1.dll, так как не знает где та лежит. Поэтому, чтобы все работало, добавьте путь к папке, где лежит cygwin1.dll (например у меня это C:\cygwin64\bin) в переменную окружения PATH.

Отладка

Чтобы можно было отладить программу, эта программа (ее исполняемый файл) должна содержать таблицу символов — информацию, которая позволяет сопоставить машинный код программы с ее исходным кодом на C или C++. Чтобы добавить в исполняемый файл таблицу символов, вы должны вызвать компилятор с ключом -g, например так:

gcc -g -o hello.exe main.c
g++ -g -o hello.exe main.cpp

Далее вы запускаете программу под управлением отладчика:

gdb hello.exe

Отладчик выводит на экран приглашение (gdb), после которого вы можете вводить различные команды, некоторые из которых перечислены в таблице ниже:

l Показать некоторое число строк исходного кода.
b Установить точку останова на заданную строку исходного кода.
r Выполнять программу пока не встретится точка останова.
s Выполнить шаг с заходом.
n Выполнить шаг с обходом.
p Вывести на экран заданное выражение.

Подробнее об отладке при помощи gdb можно почитать в книге Peter Prinz, Tony Crawford — C in a Nutshell The Definitive Reference, 2nd Edition — 2015 Chapter 21. Debugging C Programs with GDB.

3 комментария для “C/C++ в Cygwin”

  1. А что из себя представляет Cygwin по сути? Набор консольных утилит для компиляции и отладки?

    1. Я себе это представляю так. Предположим, я — пользователь Windows и предположим, мне понадобилось попрограммировать на языке Си. Среда разработки Microsoft Visual Studio, которая обычно используется для программирования в Windows, поддерживает только самый первый стандарт языка Си — C89 и не поддерживает более поздние (C99 и C11). Я же хочу программировать на современном Си. Поэтому мне нужен компилятор, который поддерживал бы последний стандарт. Такой компилятор — это всем известный GCC (GNU Compiler Collection). Но этот компилятор работает в UNIX-подобных ОС (например Linux), а не в Windows. В UNIX есть много других полезных утилит, которые хотелось бы иметь в Windows, но… Эти утилиты, разумеется, пользуются системными вызовами UNIX (системные вызовы — это функции, которые составляют API операционной системы, который она предоставляет прикладным программам). Системные вызовы UNIX описаны в стандарте POSIX. Windows, как я понимаю, не поддерживает стандарт POSIX непосредственно (но может эмулировать UNIX при помощи своих так называемых подсистем — см. https://en.wikipedia.org/wiki/Microsoft_POSIX_subsystem). У Windows есть свой набор системных вызовов, который называется Native API и который является недокументированным (зато документированным является набор функций WinAPI, которые пользуются функциями Native API). Поэтому программы для UNIX не переносимы на Windows на уровне двоичных файлов. Однако все же можно перенести UNIX’овую программу на Windows. Для этого понадобится во-первых исходный код программы. Во-вторых понадобится библиотека, которая будет содержать функции, имеющие такие же сигнатуры, как у системных вызовов UNIX (сигнатура функции — это ее имя, тип возвращаемого значения и типы параметров функции). Эти функции будут делать ту же работу, которую делают системные вызовы UNIX, но будут пользоваться при этом функциями WinAPI. Исходный код UNIX’овой програмы надо скомпилировать и скомпоновать с этой самой библиотекой.
      Так вот Cygwin — это и есть пакет UNIX’овых программ, портированных на Windows. И Cygwin включает в себя библиотеку «системных вызовов» — файл cygwin1.dll. Так что, установив Cygwin, вы получаете этакий «эмулятор UNIX» с возможностью пользоваться утилитами UNIX и писать программы, которые пользуются системными вызовами UNIX.

Добавить комментарий

Ваш адрес email не будет опубликован.