15 дек. 2011 г.

Sublime Text 2 Part 3 Компиляция C/C++

К сожалению немножко забил на блог, буду исправляться.
Вчера увидел комментарий, в котором анонимус спрашивал как скомпилировать C приложение из редактора. Наверно, спустя почти неделю, он и сам нашёл решение, но всё же мне самому стало интересно.
Наша задача - скомпилировать HelloWorld из редактора. Для этого есть встроенные средства в виде Tools -> Build (F7, CTRL+B).
Вот наш код HelloWorld:
#include <stdio.h>

int main (int argc, char* argv[]) {
 printf("hello world\n");
 return 0;
}
Как видим из скрина, он предлагает несколько вариантов для компиляции и даже можeт попытаться сам угадать что нужно использовать. У нас есть два варианта прописать собственные команды для компиляции - это через конфигурацию проекта и через общую конфигурацию редактора (как я сделал на скрине - пункт MinGW32-gcc это мой добавленный метод).Рассмотрим первый метод - через написание конфига для редактора в целом. Идём Tools -> Build System -> New Build System..., редактор создаст нам заготовку. Грешу, я сам не все опции изучил, но если есть желание то вот они. Там же и находятся доступные нам переменные символизирующие имя файла, полный путь, расширение и т.д.
То, что у меня получилось:
Заранее я прописал в path системы путь к папке с mingw32-g++.exe. Правда это можно сделать тут двумя способами - либо в "cmd" прописать полный путь до mingw32-g++, либо использовать опцию "path" и уже туда прописать полный путь то папки bin из пакета MinGW.
И ещё одна особенность - в переменных среды windows не должно быть путей с русскими символами, иначе python будет ругаться. У меня по дефолту windows 7 выставила папке пользователя имя Администратор, пришлось делать другую учётную запись, т.к. адекватного способа поменять имя папки я не нашёл (C:\Users\Администратор).
Ну что же, сохраняем наш конфиг с нужным нам именем (оно будет показываться в списке Tools -> Build System). Я назвал его MinGW32-gcc. Сохраняется оно в папочке Data\Packages\User\. Переходим на вкладку с HelloWorld, выбираем наш свежесозданный конфиг в Tools -> Build Sustem и нажимаем F7. Снизу должен появиться результат - [Finished] ну или ошибка. Если там пусто, вызываем консоль (CTRL+~) и смотрим логи.

Так же систему компиляции можно прописать и для проекта.
Создаем проект - (Project -> Save Project As...) ну и сохраняем его в папочке с исходником. далее открываем файл проекта на редактирование (Project -> Edit Project) и видим что то типа этого:
Далее мы будем использовать опцию "build_systems", которая будет добавлять наш метод компиляции в список именно для нашего проекта. Код выглядит так:
 
"build_systems":
    [
        {
            "name": "C++",
            "cmd": ["mingw32-g++.exe", "-o", "$file_base_name", "$file_name"]
        }
    ]
Ну и теперь при активации нашего проекта HelloWorld в списке Tools -> Build System будет появляться пункт C++.

Добавлю текст комментария от Анонима:
Господа, представляю вам свой отредактированный оригинальный конфиг. Стоит обратить внимание на то что сказал автор, необходимо создать профиль и пользователя с латинским именем. простое переименование пользователя не переименует папку с профилем. Для того, что бы переименовать пользователя корректно, воспользуйтесь стандартным "средством переноса файлов и параметров" для этого вам нужно будет зайти под другим администратором, упаковать весь профиль с русским именем в архив (обязательно отметте все галочки), затем создайте нового пользователя с латинским именем и распакуйте архив с помощью средства переноса, не забыв указать что вы распаковываете профиль в другого пользователя.
Обязательно выполните это:
В папке с программой ищете файл sublime_plugin.py и в заголовок добавляете:
reload(sys)
sys.setdefaultencoding('utf8')
для того, что бы питон не забывал локаль и не сбоили плагины саблайма.
Также я решил добавить путь к компилятору в системную переменную, что бы не прописывать прямые пути в конфигах. Собственно конфиг:
{
"cmd": ["g++", "${file}", "-o", "${file_path}/${file_base_name}"],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c, source.c++",
"encoding": "1251",
"variants":
[
{
"name": "Run",
"shell": true,
"cmd": ["g++", "${file}", "-o", "${file_path}/${file_base_name}", "&&", "${file_path}/${file_base_name}"]
}
]
}
В основной секции пришлось добавить указание кодировки 1251, что бы в консоли саблайма корректно отображались сообщения компилятора об ошибках. В варианте "Run" отличие от стандартного конфига состоит в том, что мы определили "shell": true и вместо того, что бы группировать команды для оболочки, чередуя одинарные и двойные кавычки - воспользовались только двойными (одинарные не желают работать в винде), приведя синтаксис к такому же, как в основной секции.

Вот собственно и всё.

10 комментариев:

  1. Нет сам так и не разобрался.. Огромное спасибо =)

    ОтветитьУдалить
  2. Сборку через make не захотел осваивать??

    ОтветитьУдалить
  3. Можно сделать и через make - в общем то суть не сильно меняется

    ОтветитьУдалить
  4. Под linux сделал вот таким образом:
    {
    "cmd": ["/usr/bin/g++ -W -Wall -Werror *.cpp"],
    "working_dir": "${file_path}",
    "shell": true
    }
    Всё работает, [Finished] показывает, а вот как сразу получившийся файлик a.out запустить?
    Я понимаю, что нужно через терминал просто ввести название файла, но я имею в виду как сразу после компиляции автоматически запустить этот файл на выполнение?

    ОтветитьУдалить
    Ответы
    1. попробуй вместо компиляции запускать скрипт который будет компилировать и запускать результат
      Под Windows это выглядит вот так:
      "cmd": ["$packages/User/c++.bat","$file","$file_path","$file_base_name"],

      Удалить
  5. Советую смотреть в сторону консольной команды питона
    os.system("имя файла")

    ОтветитьУдалить
  6. Помогите советом: проделал все настройки, как указано в данном посте, однако ST2 не компилирует любой cpp-файл выдавая ошибку "UnicodeDecodeError: 'ascii' codec can't decode byte 0xcf in position 4: ordinal not in range(128)".
    В чем может быть проблема и как её можно исправить?

    ОтветитьУдалить
    Ответы
    1. Вот вам решение проблемы, сударь.
      В папке с программой ищете файл sublime_plugin.py и в заголовок добавляете:
      import sys
      reload(sys)
      sys.setdefaultencoding('utf8')

      У меня саблайм из за этой ошибки не только компилировать не хотел, но и пэкэдж контрол вылетал с нею же.

      http://www.sublimetext.com/forum/viewtopic.php?f=3&t=6407&start=0&hilit=UnicodeEncodeError

      Удалить
  7. Добрый день!

    Проделал все как написано, но не заработало. При запуске скомпилированной программы выскакивают ошибки с ненайденными файлами из папки "..\MinGW\bin\", всякие длл-ки и прочее. В чем же проблема? Буду рад, если кто-нибудь отзовется С:

    Текст конфига:
    "cmd": ["mingw32-g++.exe", "-o", "$file_base_name", "$file_name"],
    "path": "c:\\Program Files\\MinGW\\bin\\"

    ОтветитьУдалить
  8. Господа, представляю вам свой отредактированный оригинальный конфиг. Стоит обратить внимание на то что сказал автор, необходимо создать профиль и пользователя с латинским именем. простое переименование пользователя не переименует папку с профилем. Для того, что бы переименовать пользователя корректно, воспользуйтесь стандартным "средством переноса файлов и параметров" для этого вам нужно будет зайти под другим администратором, упаковать весь профиль с русским именем в архив (обязательно отметте все галочки), затем создайте нового пользователя с латинским именем и распакуйте архив с помощью средства переноса, не забыв указать что вы распаковываете профиль в другого пользователя.

    Обязательно выполните это:


    В папке с программой ищете файл sublime_plugin.py и в заголовок добавляете:

    reload(sys)
    sys.setdefaultencoding('utf8')

    для того, что бы питон не забывал локаль и не сбоили плагины саблайма.

    Также я решил добавить путь к компилятору в системную переменную, что бы не прописывать прямые пути в конфигах. Собственно конфиг:

    {
    "cmd": ["g++", "${file}", "-o", "${file_path}/${file_base_name}"],
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",
    "encoding": "1251",

    "variants":
    [
    {
    "name": "Run",
    "shell": true,
    "cmd": ["g++", "${file}", "-o", "${file_path}/${file_base_name}", "&&", "${file_path}/${file_base_name}"]
    }
    ]
    }

    В основной секции пришлось добавить указание кодировки 1251, что бы в консоли саблайма корректно отображались сообщения компилятора об ошибках. В варианте "Run" отличие от стандартного конфига состоит в том, что мы определили "shell": true и вместо того, что бы группировать команды для оболочки, чередуя одинарные и двойные кавычки - воспользовались только двойными (одинарные не желают работать в винде), приведя синтаксис к такому же, как в основной секции.

    ОтветитьУдалить