На чем писать десктопное приложение под линукс

Обновлено: 04.07.2024

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

Это обзорная статья про программирование под Linux. Мы рассмотрим какие языки используются чаще всего, рассмотрим основные понятия, а также возможности, разберем как написать простейшую программу на одном из самых популярных языков программирования, как ее вручную собрать и запустить.

1. На чем пишут программы?

Исторически сложилось так, что ядро Unix было написано на языке Си. Даже более того, этот язык был создан для написания ядра Unix. Поскольку ядро Linux было основано на ядре Minix (версии Unix), то оно тоже было написано на Си. Поэтому можно сказать, что основной язык программирования для Linux это Си и С++. Такая тенденция сохранялась на протяжении долгого времени.

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

2. Библиотеки

Естественно, что если вам необходимо вывести строку или изображение на экран, то вы не будете напрямую обращаться к видеокарте. Вы просто вызовете несколько функций, которые уже реализованы в системе и передадите им данные, которые нужно вывести на экран. Такие функции размещаются в библиотеках. Фактически, библиотеки - это наборы функций, которые используются другими программами. В них находится такой же код, как и в других программах, разница лишь в том, там необязательно присутствие функции инициализации.

Библиотеки делятся на два типа:

  • Статические - они связываются с программой на этапе компиляции, они связываются и после этого все функции библиотеки доступны в программе как родные. Такие библиотеки имеют расширение .a;
  • Динамические - такие библиотеки встречаются намного чаще, они загружены в оперативную память, и связываются с программной динамически. Когда программе нужна какая-либо библиотека, она просто вызывает ее по известному адресу в оперативной памяти. Это позволяет экономить память. Расширение этих библиотек - .so, которое походит от Shared Object.

Таким образом, для любой программы на Си нужно подключать библиотеки, и все программы используют какие-либо библиотеки. Также важно заметить, на каком языке бы вы не надумали писать, в конечном итоге все будет сведено к системным библиотекам Си. Например, вы пишите программу на Python, используете стандартные возможности этого языка, а сам интерпретатор уже является программой на Си/С++, которая использует системные библиотеки для доступа к основным возможностям. Поэтому важно понимать как работают программы на Си. Конечно, есть языки, вроде Go, которые сразу переводятся на ассемблер, но там используются принципы те же, что и здесь. К тому же системное программирование linux, в основном, это Си или С++.

3. Процесс сборки программы

Перед тем как мы перейдем к практике и создадим свою первую программу, нужно разобрать как происходит процесс сборки, из каких этапов он состоит.

Каждая серьезная программа состоит из множества файлов, это файлы исходников с расширением .c и заголовочные файлы с расширением .h. Такие заголовочные файлы содержат функции, которые импортируются в программу из библиотек или других файлов .с. Перед тем. как компилятор сможет собрать программу и подготовить ее к работе, ему нужно проверить действительно ли все функции реализованы, доступны ли все статические библиотеки и собрать ее в один файл. Поэтому, первым делом выполняется препроцессор, который собирает исходный файл, выполняются такие инструкции, как include для включения кода заголовочных файлов.

На следующем этапе к работе приступает компилятор, он выполняет все необходимые действия над кодом, разбирает синтаксические конструкции языка, переменные и преобразовывает все это в промежуточный код, а затем в код машинных команд, который мы можем потом посмотреть на языке ассемблера. Программа на этом этапе называется объектный модуль и она еще не готова к выполнению.

Далее к работе приступает компоновщик. Его задача связать объектный модуль со статическими библиотеками и другими объектными модулями. Для каждого исходного файла создается отдельный объектный модуль. Только теперь программа может быть запущена.

А теперь, давайте рассмотрим весь єтот процесс на практике с использованием компилятора GCC.

4. Как собрать программу

Для сборки программ в Linux используется два типа компиляторов, это Gcc и Clang. Пока что GCC более распространен, поэтому рассматривать мы будем именно его. Обычно, программа уже установлена в вашей системе, если же нет, вы можете выполнить для установки в Ubuntu:

sudo apt install gcc

Перед тем как мы перейдем к написанию и сборке программы, давайте рассмотрим синтаксис и опции компилятора:

$ gcc опции исходный_файл_1.с -o готовый_файл

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

  • -o - записать результат в файл для вывода;
  • -c - создать объектный файл;
  • -x - указать тип файла;
  • -l - загрузить статическую библиотеку.

Собственно, это все самое основное, что нам понадобится. Теперь создадим нашу первую программу. Она будет выводить строку текста на экран и чтобы было интереснее, считать квадратный корень из числа 9. Вот исходный код:

int main() printf("losst.ru\n");
printf("Корень: %f\n", sqrt(9));
return 0;
>

Я специально добавил функцию корня чтобы показать как работать с библиотеками. Сначала нужно собрать объектный файл. Перейдите в папку с исходниками и выполните:

gcc -c program.c -o program.o


Это этап компиляции, если в программе нет ошибок, то он пройдет успешно. Если исходных файлов несколько, то такая команда выполняется для каждого из них. Далее выполняем линковку:

gcc -lm program.o -o program


Обратите внимание на опцию -l, с помощью нее мы указываем какие библиотеки нужно подключить, например, здесь мы подключаем библиотеку математических функций, иначе компоновщик просто не найдет где есть та или иная функция. Только после этого можно запустить программу на выполнение:


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


Это две библиотеки загрузчика, стандартная libc и libm, которую мы подключили.

5. Автоматизация сборки

Когда мы рассматриваем программирование под Linux невозможно не отметить систему автоматизации сборки программ. Дело в том, что когда исходных файлов программы много, вы не будете вручную вводить команды для их компиляции. Можно записать их один раз, а затем использовать везде. Для этого существует утилита make и файлы Makefile. Этот файл состоит из целей и имеет такой синтаксис:

цель: зависимости
<Tab> команда

В качестве зависимости цели может быть файл или другая цель, основная цель - all, а команда выполняет необходимые действия по сборке. Например, для нашей программы Makefile может выглядеть вот так:

program: program.o
gcc -lm program.o -o program

program.o: program.c
gcc -c program.c -o program.o

Затем вам достаточно выполнить команду make для запуска компиляции, только не забудьте удалить предыдущие временные файлы и собранную программу:


Программа снова готова и вы можете ее запустить.

Выводы

Создание программ Linux очень интересно и увлекательно. Вы сами убедитесь в этом, когда немного освоитесь в этом деле. Сложно охватить все в такой небольшой статье, но мы рассмотрели самые основы и они должны дать вам базу. В этой статье мы рассмотрели основы программирования в linux, если у вас остались вопросы, спрашивайте в комментариях!

Курс программирования на Си под Linux:

Хочу написать GUI-приложение, да так, чтобы впоследствии было достаточно нетрудно его перенести на OS X, в идеале просто скомпилировать для этой платформы и оно заработало. Какой язык / стек выбрать?

Java? Наверное, таки Java?

UPDATE: приложение должно будет вытаскивать из Postgresql данные, показывать в табличке, редактировать данные и сохранять обратно в таблички + немного логики. Данных будет немного, несколько тысяч записей. Веб-приложение тут не подойдет, база будет локально лежать у каждого юзера своя.

Common Lisp / LispWorks CAPI

Что приложение должно делать?

Да! JavaFX — твой выбор. Если хочешь пойти более трудным путем, то бери C++ и Qt

Добавил в первый пост описание.

На яве нормально будет. У маков же всё нормально с явой?

А что не дотнет?


Qt. И вопрос, если база у юзверя своя локальная, зачем постгрес? Не проще sqlite заюзать?

shift видимо завис или я не умею синхронно.

несколько тысяч записей
Один локальный коннект
Пг с дефолтными настройками

Mate, you're doing it wrong!

Возьми SQLite, и хоть на телефоны переноси.

Только на маке выглядит как говно.


У идеи гуй на JavaFX?

Нет, у них свой фреймворк поверх AWT.

qt с qml, очевидно же

JS мерзок, а тащить целый браузер нерационально для моей довольно простой проги.

жаба и моно весят больше чем электрон.

Только везде кроме линукса выглядит как говно.



Десктоп - значит нормальный кроссплатформенный красивый GUI. И кроме Qt 5 мне ничего не приходит. И с базой данных там будет сразу хорошо.

Я серьезно, не вижу смысла на десктопе ничего кроме Qt 5. Перенести просто скомпилировав? Точно Qt. Даже я, ставив хакинтош, без проблем компилял свой софт для OS X, просто нажимая build в Qt Creator для мака.


Всё как-то слышится то там то сям про libui то Xwt, но где же уровень и качество?

Я же с мака вещаю.


нормальный кроссплатформенный красивый GUI


Если вы хотите, что бы версией для macOS пользовались, то придется писать нативную GUI. Иначе вашим приложением пользоваться будете вы и еще полтора с половиной человека.


Ты его на макоси видел? Впрочем, оно везде выглядит как говно.

Если плевать, как выглядит, пиши на python+Tk, в противном случае пиши гуй на какаве и гтк с одинаковым интерфейсом и линкуй родное на каждой платформе.


Я не говорил что он должен быть нативно-выглядящим. Просто качественным красивым кроссплатформенным. Это Qt 5. Противоречия нет.


Ты его на макоси видел? Впрочем, оно везде выглядит как говно.


есть что-то кроссплатформенное, что выглядит лучше?


Я, как маковод с четырехлетним стажем — скажу, что GTK и Java выглядят просто на порядок хуже, а wx отдельная печальная песня.


I-Love-Microsoft ★★★★★ ( 10.10.16 12:51:08 )
Последнее исправление: I-Love-Microsoft 10.10.16 12:51:41 (всего исправлений: 1)


JavaFX неплох. Может тянуть внутри себя JVM, так что на выходе получается бандл ещё меньший, чем при использовании Qt 5 с ICU.


Меня не интересуют некие языки, С++ / Qt вполне устраивает.


Можно ещё сделать так, как это сделал популярный плеер VLC:

Для GNU/Linux — Qt 5, для macOS — CocoaAPI. Но на Qt 5 под macOS писать не рекомендуется. Слишком большая разница между UX у программы на нативных API и программой на Qt.

Да и раздут Qt 5. Во времена Qt 4 ещё можно было понять: либа и исполнительный файл приложения < 10 МБ. А теперь там около 50 МБ всякого разного дерьма через macdeployqt притягивается. Ну и на кой грызть C++ (даже присахаренный Qt'ом) если можно взять тот же JavaFX и получить бандл с программой и JVM всего на 30 МБ? При этом работать программа на JavaFX будет примерно так же быстро, как и Qt-шная, но при этом: весит меньше, а скорость разработки — выше.

EXL ★★★★★ ( 10.10.16 12:56:32 )
Последнее исправление: EXL 10.10.16 13:01:57 (всего исправлений: 2)


Очевидный Qt, но на маке он не очень.


JavaFX оно развивается еще? А формы там как делают? Я не против Java, для меня всё кроссплатформенное опенсорсное - гуд.


При этом работать программа на JavaFX будет примерно так же быстро

Во-первых оценка размера завышена в несколько раз, во-вторых кого это вообще заботит? Люди качают приложения на электроне и не жужжат.

CrossFire ★★★★★ ( 10.10.16 13:16:54 )
Последнее исправление: CrossFire 10.10.16 13:19:00 (всего исправлений: 1)


Чтобы фанатеть от GUI-тулкита нужно быть ушибленным на голову. Я говорю по делу: я всегда положительно отзывался о Qt, когда он был лёгким и быстрым. Но в Qt 5 они свернули куда-то не туда. Спасибо местному Поттерингу — Тьяго.

Так что какой смысл ковыряться с C++ и отлавливать сегфолты, когда на выходе получается куча зависимостей, которая суммарно по размеру больше чем JavaFX + JVM (!). И всё так же медленно работает.

Раздеплоить на все популярные системы:

И оно будет просто работать.

В этой статье я расскажу вам о некоторых самых популярных фреймворках, которые помогут вам при разработке программ для компьютеров под управлением Windows/MacOS/Linux. Если вы опытный программист, то вряд ли найдете в этой статье что-то новое для себя. Она скорее для новичков, которые ищут простое решение своей проблемы — быстрое написание хорошей (на сколько это возможно) кроссплатформенной программы.


Что такое кроссплатформенная разработка?

Что вообще из себя представляет кроссплатформенная разработка? Если вам нужно, чтобы ваше приложение работало сразу на нескольких операционных системах с минимальными затратами человеко-ресурса, то скорее всего вы прибегнете именно к этому. Вы разрабатываете одну программу, пишете один код, а он запускается на всех поддерживаемых платформах. Удобно! Но стоит различать кроссплатформенность и нативность.

Если вкратце, то кроссплатформенность — это способность программного обеспечения работать с несколькими аппаратными платформами или операционными системами. Нативные программы в свою очередь пишутся для работы на определенной аппаратной или программной платформе. Из этого можно сделать вывод: если ваша программа будет работать с железом, то скорее всего даже в кроссплатформенной программе вам придется прописывать нативный функционал для конкретной платформы.

В чем же преимущество кроссплатформенной разработки? Во-первых, вам нужно задействовать меньше людей (не нужно содержать DotNet разработчика, Swift/objective C разработчика и всех к ним прилагающихся), во вторых вы охватываете большее количество устройств -> больше людей смогут пользоваться вашей программой.

Также подобный принцип не лишен недостатков — плохая нативность, оптимизация тоже будет хуже, чем у такой же программы написанной под конкретную платформу. Но иногда бывает такое, что вам очень нужно, чтобы ваше приложение поддерживало несколько платформ, но разрабатывать под каждую возможности нет. Тогда на помощь приходят уже созданные Фреймворки и технологии для разработки кроссплатформенных GUI. Вот некоторые из них:

Electron JS


Недавно я написал статью о том, как на Electron JS написать "Hello World". В комментариях поднялась дискуссия о "за и против" этой технологии. До сих пор очень многие разработчики ведут споры относительно того, стоит ли использовать Electron в своих проектах или нет. Electron JS — это JavaScript фреймворк, позволяющий вам написать полноценную программу используя Web Технологии — HTML & CSS, JS. Electron JS представляет собой движок Chromium в котором и исполняется весь ваш код. У Electron'a есть один, но достаточно серьезный недостаток — большое потребление памяти, как физической, так и оперативной. Всем давно известно, какой прожорливый Chrome, а мы на него еще своего кода хотим навесить. Но если посмотреть с другой стороны: сегодня многие популярные приложения написаны на Electron'e — Slack, Skype, Discord, VSCode, Atom, Postman, Insomnia и т.д. А с учетом непрекращающегося роста мощности компьютеров все реже приходится слышать от пользователей, что «ваш хром съел всю мою память». Высокое потребление памяти не будет играть большой роли если продукт будет хорош в своей сфере, будет грамотно написан код и распределены процессы

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

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

Ниже приведен список лучших языков программирования, которые можно использовать для разработки настольных приложений в Linux, этот список не основан на уровне важности, так как все языки здесь хороши, и они также кроссплатформенны, что означает вы можете заставить те же приложения работать на других операционных системах.

1. C / C ++

Эти два языка, хотя и считаются разными языками программирования, C ++ - это просто расширение языка Cи, и он добавляет объектно-ориентированные возможности в C, поэтому их можно сгруппировать вместе.

Как вы, возможно, уже знаете, Linux в основном работает на языке Cи с частями сборки. Поэтому вы можете использовать Cи и использовать GTK + кросс-платформенный инструментарий для приложений с графическим интерфейсом.

C++ считается лучшим выбором для разработки программного обеспечения из-за его высокой производительности, но, возможно, он не подходит для новичков из-за его высоких требований к точности в таких областях, как управление памятью. Он также широко используется для разработки программного обеспечения Windows.

Вы также можете использовать Qt, который является отличной кросс-платформенной средой разработки приложений, основанной на C ++.

Qt является как коммерческим, так и открытым исходным кодом и очень поможет вам в разработке настольных приложений в сочетании с C и C ++.

2. Java

Java - это мощный, полностью объектно-ориентированный и кроссплатформенный язык программирования, который предлагает широкие возможности для построения сетевых приложений.

Изначально Java была предназначена для запуска апплетов в веб-браузерах, но она всегда имела удивительные возможности для запуска настольных приложений с самого начала.

Java - одна из лучших, особенно если у вас есть намерение разрабатывать приложения, которые будут работать практически на любой соответствующей операционной системе. Java прекрасно подходит для перехода с одной операционной системы на другую, особенно с Windows или Mac OS X на Linux , без необходимости переноса существующих приложений.

3. Python

Python - это высокоуровневый, универсальный, динамичный и интерпретируемый язык программирования, который верно становится популярным на рынке.

Многие программисты обращаются к Python из-за его легкого для чтения синтаксиса и способности позволить программистам выражать концепции в несколько строк кода по сравнению с другими языками программирования. Ему легко учиться, и это хороший вариант для начинающих.

Python является одним из популярных языков в Linux , и многие приложения разрабатываются с его использованием, и вы можете использовать фреймворки, такие как Qt и GTK .

4. JavaScript (Electron)

JavaScript прост в изучении, и при использовании в сочетании с HTML и CSS вы можете создавать удивительные настольные приложения для Linux.

Electron - это среда, используемая для разработки собственных кроссплатформенных приложений с использованием веб-технологий, и она активно поддерживается в GitHub и сообществе участников.

Это также хороший вариант для начинающих, намеревающихся разрабатывать настольные приложения для Linux и других операционных систем.

5. Shell

Shell не только позволяет системному пользователю взаимодействовать с ядром, но также является полноценным языком программирования, причем наиболее распространенными являются конструкции языка общего программирования с GNU Bash (Bourne Again Shell) .

Он совместим с sh (Bourne Shell), а также включает в себя множество полезных функций от ksh (Korn Shell) и csh (C Shell) . Вы можете использовать его с такими инструментами, как Qt et al, которые позволяют отображать диалоговые окна GTK + из терминала, используя скрипты.

Заключение

Как всегда, у вас также есть свои собственные взгляды, поэтому любая критика, которая просвещает и помогает пользователям Linux, приветствуется. Если вы используете языки программирования и фреймворки, не добавленные в этот список, вы можете сообщить нам об этом и о любом другом мнении по данной теме, оставив комментарий внизу.

Если статья была для вас полезной, просим поставить лайк и подписаться на наш канал . Также посетите наш сайт , чтобы увидеть больше подобного контента.

10 лучших IDE для Linux

1. Eclipse

Eclipse

Бесплатный редактор с открытым кодом, созданный для тяжелой разработки на Java. Может работать с языками программирования: Ruby, Java, C, Perl, Python, PHP, C++ и другие.

  • Поддержка большого количества языков программирования.
  • Много плагинов для расширения возможностей.
  • Инструменты для Java EE проектов.
  • Инструменты для разработки на Java.
  • Среда разработки плагинов.
  • Интеграция с Junit.
  • Поддержка системы Git.

2. Bluefish

Bluefish

  • Быстрый и чистый.
  • Легкий.
  • Поддерживает многопоточность.
  • Неограниченное выполнение команд отменить/повторить.
  • Много разнообразных инструментов.
  • Авто-восстановление после крашей.
  • Мощный инструмент поиска и замены.

3. NetBeans

NetBeans

Бесплатная и открытая IDE от Sun Microsystems. Поддерживает такие ЯП как: Java, Python, C++, C, Ruby, PHP, JavaScript.

  • Удобный интерфейс.
  • Кросс-платформенная.
  • Динамические и статические библиотеки.
  • Мульти-сессионный интегрированный отладчик GNU.
  • Рефакторинг в редакторе, Обработчик классов и навигатор.
  • Поддержка инструментов Qt.
  • Универсальные команды Run и Debug.

4. Zend Studio

Zend Studio

PHP программисты используют Zend для быстрого написания кода, легкого решения проблем и свободного интегрирования в облако. Zend Studio, PHP Unit и Composer образуют одно целое и становятся мощным инструментом для мобильных и PHP разработчиков.

Работает с такими языками как: HTML, PHP, JavaScript.:

  • Поддержка большинства баз данных.
  • Обнаружение ошибок в реальном времени.
  • Рефакторинг кода.
  • Параметры управления исходным кодом.
  • Локальная и серверная отладка.

5. Komodo IDE

Komodo IDE

Эта IDE под Linux, созданная в Mozilla, заслужила множество наград. Поддерживает языки программирования: Python, PHP, HTML, Perl, RHTML, C, CSS, C++, JS, Ruby, Django. Основные фишки:

  • Кросс-платформенная.
  • Профилирование кода для PHP и Python.
  • Графическая отладка.
  • Расширенные функции редактирования с многооконным и разделенным видом.
  • Множество дополнений.
  • Много настроек для кастомизации.
  • Отладка и развертывание в Stackato PaaS.

6. Anjuta

Anjuta

Универсальная IDE, которая включает в себя ряд расширенных возможностей, таких как мастер приложений, редактор исходного кода, управление проектами и версиями, профилировщик, отладчик, дизайнер графического интерфейса и другие инструменты. Anjuta предоставляет простой графический интерфейс и достаточные мощности для систематической разработки. Поддержка языков: C и C++.

  • Простой пользовательский интерфейс.
  • Мастер проектов и готовые шаблоны.
  • Интегрированный Glade.
  • Интегрированный DevHelp.

7. MonoDevelop

MonoDevelop

  • Изменяемое рабочее пространство, которое соответствует виду вашего рабочего процесса.
  • Встроенный отладчик.
  • Визуальный дизайнер.
  • Развертывание и тестирование.
  • Объектно-ориентированный API.
  • Инструменты для увеличения возможностей.

8. CodeLite

CodeLite

Бесплатный проект с открытым исходным кодом для разработки на C++ и C под разные платформы. Полезные фишки:

  • Встроенная поддержка GDB, GCC, clang, VC++.
  • Плагины GIT.
  • Подсветка синтаксиса для различных языков.
  • 2 механизма, завершающих код, которые работают одновременно.
  • Просмотр локальных потоков процессора, просмотр дерева и памяти.

9. Kdevelop

Kdevelop

Полноценная и расширяемая IDE для C, C++, PHP и Ruby. Основные преимущества:

  • Кросс-платформенная.
  • Используется для KDE/QT разработки.

10. Geany

Geany

Хотя Geany имеет базовые возможности IDE, он является текстовым редактором, который работает на GTK2 библиотеке. Он был спроектирован так, чтобы стать маленькой и быстрой IDE. Поддерживаемые языки: HTML, PHP, Java, C, Perl, Pascal, Python.

  • Автоматическое закрытие тегов XML и HTML.
  • Развитая система навигации по коду.
  • Работает на нескольких платформах.
  • Позволяет создавать пользовательские плагины.
  • Свертывание кода и подсветка синтаксиса.
  • Простое управление проектом.

Как уже сказал выше, были рассмотрены далеко не все среды разработки для Linux, есть и другие хорошие решения: IDE от JetBrains, Code::Blocks и Qt Creator. Расскажите в комментариях ниже о тех приложениях, что вы используете у себя.

Читайте также: