Как собрать приложение из исходников с github
Перейти к содержимому

Как собрать приложение из исходников с github

  • автор:

Как собрать приложение из исходников с github

БлогNot. Как собрать проект C++ с github из исходников и подключить его к Visual Studio

Как собрать проект C++ с github из исходников и подключить его к Visual Studio

P.S. В новых сборках Visual Studio проекты из репозиториев открываются просто из меню Файл — Клонировать репозиторий. В статье речь идёт о ситуации, когда так сделать невозможно.

Благодаря менеджеру пакетов winget, уже входящему в актуальные сборки масдайки, теперь в Windows 10 можно инсталлировать приложения одной простой консольной командой (см. также доку от Микрософта).

Но мы рассмотрим сейчас ситуацию, когда у нас есть только ссылка на исходники проекта, скажем, на Гитхабе (возьмём для примера библиотеку для простых чисел primesieve) и нужно каким-то образом «вручную» скомпилировать внешний проект в своей Studio, чтобы воспользоваться его возможностями в своём приложении.

В противном случае, конечно же, нестандартный include вроде этого, который вы нашли в коде-образце

#include

работать не будет ни за что.

Первым делом скачаем все исходники внешнего проекта «как есть» в архиве .zip, для этого у нас на гитхабе есть кнопка «Download ZIP»:

Как загрузить проект с github в архиве .zip

Как загрузить проект с github в архиве .zip

Развернём проект, не создавая новой папки, если у вашего архиватора нет такого же пункта меню, просто сотрите предлагаемое архиватором имя новой папки, потому что папка уже есть в архиве:

Извлечь внешний проект из архива, не создавая новой папки

Извлечь внешний проект из архива, не создавая новой папки

Если покопаться в файле readme.md проекта, как правило, можно найти инструкцию по установке (Build instructions) и даже «Detailed build instructions», где говорится, в числе прочего, и о компиляции проекта под Microsoft Visual C++:

Команды cmake для компиляции проекта со страницы документации

Команды cmake для компиляции проекта со страницы документации

Откроем свой «некомпилируемый» без нужной библиотеки проект в Studio (я использую актуальную сборку версии 2019) и обратимся к команде меню Вид — Терминал. Выберем инструмент «Командная строка разработчика» (по умолчанию в новых сборках теперь выбран PowerShell, впрочем, если в документации приведены команды PowerShell, то применяйте их).

У Микрософта инструмент описан вот здесь.

Командная строка разработчика в Studio

Командная строка разработчика в Studio

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

d: cd \temp\primesieve-master

— теперь я в нужной папке, так как развернул свой архив в папку d:\temp

Далее как написано:

cmake -G "Visual Studio 16 2019" . cmake --build . --config Release

Можно просто копировать команды со страницы документации, в окне консоли вверху есть стандартная кнопочка «Вставить». А вот точка в записи команд имеет значение, это ссылка на текущую папку!

Ну и, конечно, для другой версии Studio будет другое указание компилятора, узнать своё можно командой

cmake -G

Нужный генератор будет помечен в списке «звёздочкой».

Если что-то пошло не так, ошибаетесь в консольных командах и получаете сообщения об ошибках кэша — сотрите файл CMakeCache.txt из папки скопированного проекта и попробуйте снова.

Теперь проект можно открывать в Studio и работать с ним, все нужные файлы есть в папке d:\temp\primesieve-master

Но мы хотим подключить всё, что нужно, к своему имеющемуся проекту, а не пытаться модифицировать чужую библиотеку.

  • Меню Проект — Свойства, слева выбираем Свойства конфигурации, C/C++, Общие, раскрываем поле «Дополнительные каталоги включаемых файлов», говорим «Изменить» и показываем на папку D:\Temp\primesieve-master\include . В вашем проекте, как правило, тоже будет вложенная папка include .
  • В том же окне выбираем Компоновщик — Общие — Дополнительные каталоги библиотек, «Изменить» и добавляем путь D:\Temp\primesieve-master\Release . Этого может оказаться мало, у вашего проекта и внешнего должны быть выбраны одинаковые конфигурации решения. Так как я выбрал Release для внешнего проекта, то и в своём проекте в списке «Конфигурации решения» (на стандартной панели инструментов) указал Release и платформу x64. Можно было работать и с Debug, но тогда и внешний проект компилируем как Debug и потом выбираем путь D:\Temp\primesieve-master\Debug .
  • В списке C/C++ — Создание кода — Библиотека времени выполнения выбрал Многопоточный DLL (/MD), иначе будет «LNK2038: обнаружено несоответствие для ‘RuntimeLibrary’: значение ‘MT_StaticRelease’ не соответствует значению ‘MD_DynamicRelease’ в file.obj».
  • Сам файл библиотеки, как правило имеющий тип .lib , тоже нужно прописать. Всё в том же окне свойства проекта выбираем список Компоновщик — Ввод, раскрываем список «Дополнительные зависимости», жмём «Изменить» и указываем в поле ввода имя файла библиотеки primesieve.lib
  • На всякий случай, проверяем, что у нас в списке Компоновщик — Система — Подсистема, у меня там просто Консоль (/SUBSYSTEM:CONSOLE) , для других типов проектов может понадобиться изменение и этой настройки.

После этого у меня всё заработало.

Ну а конкретная задача, на которой я проверял библиотеку — печать самых длинных цепочек последовательных простых чисел, в которых разница между соседними значениями строго возрастает или строго убывает, предел счёта равен 1000000, вот сама программа:

#include #include #include #include void print_diffs(const std::vector& vec) < for (size_t i = 0, n = vec.size(); i != n; ++i) < if (i != 0) std::cout std::cout int main() < std::vector asc, desc; std::vector max_asc, max_desc; size_t max_asc_len = 0, max_desc_len = 0; uint64_t prime; const uint64_t limit = 1000000; for (primesieve::iterator pi; (prime = pi.next_prime()) < limit; ) < size_t alen = asc.size(); if (alen >1 && prime — asc[alen — 1] = max_asc_len) < if (asc.size() >max_asc_len) < max_asc_len = asc.size(); max_asc.clear(); >max_asc.push_back(asc); > size_t dlen = desc.size(); if (dlen > 1 && prime — desc[dlen — 1] >= desc[dlen — 1] — desc[dlen — 2]) desc.erase(desc.begin(), desc.end() — 1); desc.push_back(prime); if (desc.size() >= max_desc_len) < if (desc.size() >max_desc_len) < max_desc_len = desc.size(); max_desc.clear(); >max_desc.push_back(desc); > > std::cout

Ответы вышли такие:

Longest run(s) of ascending prime gaps up to 1000000: 128981 (2) 128983 (4) 128987 (6) 128993 (8) 129001 (10) 129011 (12) 129023 (14) 129037 402581 (2) 402583 (4) 402587 (6) 402593 (8) 402601 (12) 402613 (18) 402631 (60) 402691 665111 (2) 665113 (4) 665117 (6) 665123 (8) 665131 (10) 665141 (12) 665153 (24) 665177 Longest run(s) of descending prime gaps up to 1000000: 322171 (22) 322193 (20) 322213 (16) 322229 (8) 322237 (6) 322243 (4) 322247 (2) 322249 752207 (44) 752251 (12) 752263 (10) 752273 (8) 752281 (6) 752287 (4) 752291 (2) 752293

За счёт хорошо оптимизированного кода библиотеки считается всё мгновенно.

Это задача из списка задач на простые числа

21.10.2021, 13:15 [9551 просмотр]

Как собрать apk из исходников github?

Я хочу скомпилить и установить вот это приложение:
https://github.com/GhostFlying/image-to-camera
С программированием под андроид дел никогда не имел.
Знающие люди, подскажите путь.
Типа: «клонируешь репу с гита, потом ставишь андроид студию, настраиваешь то и это и жмешь вот это и будет тебе apk»

  • Вопрос задан более трёх лет назад
  • 2274 просмотра

2 комментария

Простой 2 комментария

Денис Загаевский @zagayevskiy Куратор тега Android
Ну ты уже склонировал и студию поставил?

androidovshchik

Влад Калюжный @androidovshchik
Мне кажется, вы сами ответили на свой вопрос
Решения вопроса 0
Ответы на вопрос 2

Miay

Full stack engineer
Android studio
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
navy_it @navy_it Автор вопроса

Раз уж мы все здесь собрались я переформулирую свой вопрос)

Есть приложение, которое включает камеру и хочет получить из нее фото.
Я не согласен с таким поведением и хочу дать приложению фото, сделанное заранее.

Нашел приложение Fake Camera — ссылка
Но ни из моих установленных приложение не запрашивает у меня выбор камеры, все приложения в телефоне запускают сразу дефолтную камеру.
Настройки — Приложения — Камера — дефолтное приложение — все пусто.

Я пошел качать Андроид студию и обнаружил там эмулятор андроида. Установит ManyCam, выставил картинку как источник камеры. Штатное приложение камеры на эмуляторе вроде бы видит картинку. Вродебы — это значит в режиме видеосъемки, когда переключаю в режим фото — выдает ошибку.

Но появилась и вторая проблема, я не могу установить нужное приложение из гугл плей, так как он ругается на несовместимый девайс «Google emulator ai что-то там».

Возник ряд вопросов:
1. Можно ли переименовать устройство в эмуляторе чтобы оно называлось как телефон, а не как эмулятор? Тогда, возможно, я смогу обойтись костылем через проброс картинки в драйвер вебмкамеры/

2. Возможно ли на нерутованом телефоне подменить приложение камеры?
3. Как можно на рутованном телефоне подменить камеру? в распоряжении имею Samsung Galaxy note 3.

Пока искал решение наткнулся на вот такую страничку с исходниками, но не понимаю это полезное или не в тему ссылка

3. Сборка приложения¶

Разделить приложение, разработанное в лабораторной работе 1, на два модуля: статическую библиотеку и приложение. Доработать Makefile . Настроить автоматические сборки в сервисе GitHub Actions.

Реализовать вычисление периметра и площади для выбранных фигур.

Окружность, треугольник, полигон.

Материалы для подготовки к работе¶

  1. Документация GNU Make Обязательный минимум:
    1. Overview of make
    2. An Introduction to Makefiles
    3. Writing Makefiles
    4. Writing Rules
    5. Writing Recipes in Rules
    6. How to Use Variables:
      1. Basics of Variable References
      2. The Two Flavors of Variables
      1. About continuous integration
      2. Quickstart for GitHub Actions

      Процесс сборки¶

      Этапы компиляции¶

      В простейшем случае компилятор принимает на вход файлы с исходным кодом и создает исполняемый файл:

      Процесс сборки приложения состоит из ряда этапов, на каждом из которых ее можно прервать:

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

      gcc -Wall -Werror -c main.c gcc -Wall -Werror -c square.c gcc -Wall -Werror -c sort.c 

      Затем из объектных файлов собирают исполняемый файл:

      gcc main.o square.o sort.o -o program 

      Зависимости при сборке приложения на языке С¶

      Рассмотрим примитивное приложение на языке С, состоящее из трех файлов.

      #pragma once void say_hello(); 
      #include "hello.h" #include void say_hello()  printf("Hello\n"); > 
      #include "hello.h" int main()  say_hello(); return 0; > 

      Для сборки этого приложения можно использовать мейкфайл:

      CFLAGS = -Wall -Wextra -Werror hello: main.o hello.o $(CC) $(CFLAGS) -o $@ $^ main.o: main.c $(CC) -c $(CFLAGS) -o $@ $< hello.o: hello.c $(CC) -c $(CFLAGS) -o $@ $
      

      Приведенный мейкфайл намеренно избыточен для простоты понимания. Ему соответствует следующий граф зафисимостей:

      digraph G < bgcolor =

      "main.o"; "hello" -> "hello.o"; "main.o" -> "main.c"; "hello.o" -> "hello.c"; >" />

      Легко понять последовательность команд в случае изменения одного из исходников. Так, при изменении файла main.c :

      \begin mtime(main.c) &\gt& mtime(main.o) &\Rightarrow rebuild(main.o) \\ mtime(main.o) &\gt& mtime(hello) &\Rightarrow rebuild(hello) \end

      Где \(mtime\) — Modification time, время изменения файла, см. stat(2).

      Проблема этого мейкфайла в том, что он не учитывает зависимость исходников от заголовочного файла. Так, при изменении файла hello.h должны быть перекомпилированы все подключающие его исходники, но в данном случае этого не произойдет. На практике крайне сложно вручную отслеживать подключения всех заголовочных файлов. Для решения этой проблемы компилятор может сгенерировать файлы с зависимостями с помощью опции -MMD . Эти файлы нужно подключить с помощью директивы -include . После этого мейкфайл примет вид:

      CFLAGS = -Wall -Wextra -Werror CPPFLAGS = -MMD hello: main.o hello.o $(CC) $(CFLAGS) -o $@ $^ main.o: main.c $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< hello.o: hello.c $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< -include main.d hello.d 

      Статические библиотеки¶

      Для удобства сборки, тестирования и распространения приложения разделяют на модули. Один из типов таких модулей — статическая библиотека.

      Для сборки статической библиотеки нужно:

      1. Скомпилировать исходники в объектные файлы.
      2. Создать архив объектных файлов.

      Для нашего примера мейкфайл может выглядеть так:

      CFLAGS = -Wall -Wextra -Werror CPPFLAGS = -MMD hello: main.o libhello.a $(CC) $(CFLAGS) -o $@ $^ main.o: main.c $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< libhello.a: hello.o ar rcs $@ $^ hello.o: hello.c $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< -include main.d hello.d 

      Тогда граф зависимостей примет вид:

      digraph G < bgcolor =

      "main.o"; "hello" -> "libhello.a"; "libhello.a" -> "hello.o"; "main.o" -> "main.c"; "hello.o" -> "hello.c"; "main.c" -> "hello.h"; "hello.c" -> "hello.h"; >" />

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

      Структура проекта¶

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

      . |-- bin | `-- .keep |-- .clang-format |-- .gitignore |-- Makefile |-- obj | |-- .keep | `-- src | |-- hello | | `-- .keep | `-- libhello | `-- .keep |-- README.md `-- src |-- hello | `-- main.c `-- libhello |-- hello.c `-- hello.h
      • bin — каталог для исполняемых файлов.
      • obj — каталог для промежуточных артефактов сборки (объектные файлы, файлы зависимостей, статические библиотеки).
      • */.keep — пустой файл для сохранения структуры каталогов проекта.

      Пример структуры доступен по ссылке: project-skeleton.

      Если мейкфайл в примере по ссылке кажется вам слишком сложным или непонятным, вы можете пойти по одному из двух путей:

      1. Писать свой вариант проще. Пусть для каждого исходника или объектного файла будет явно прописанное правило. В этом случае будьте готовы к большому работу однообразной работы и необходимости вручную вписывать каждый новый исходник в мейкфайл. Если вы пойдете этим путем, то хотя бы вынесите флаги компиляции в переменную. Это сэкономит время, если потребуется изменить набор опций для отладочной сборки. В рамках курса мы осознанно не рассматриваем как реализовывать отдельные конфигурации Debug/Release с помощью мейкфайла.
      2. Прочитайте документацию и разберитесь в происходящем.

      Код возврата (exit status)¶

      Код возврата — это целочисленное значение, которое дочерний процесс возвращает родительскому процессу в момент завершения.

      При запуске программ из командной строки родительским процессом выступает командная оболочка (зачастую bash), а дочерним процессом — запускаемая утилита.

      До сих пор написанные вами приложения возвращали 0. Возвращаемое значение можно посмотреть в переменной окружения $? . Например:

      int main()  return 42; > 
      $ gcc -o answer main.c $ ./answer $ echo $? 42 

      Принято соглашение: в случае успешного завершения приложение должно возвращать ноль, в случае ошибки — ненулевой код. Этому соглашению следует большинство утилит, в том числе gcc и make :

      $ gcc gcc: fatal error: no input files compilation terminated. $ echo $? 1 

      Руководство¶

      Соглашения о рабочем процессе¶

      Эта и следующая лабораторные работы выполняются в соответствии с A simple git branching model.

      1. Для каждой задачи/новой функциональности/лабораторной работы создается новая ветка.
      2. После завершения работы ветка сливается в main . При необходимости выполняется rebase .

      Аналогичные соглашения требуется соблюдать и в курсовом проекте.

      Доработка структуры проекта¶

      Прежде чем реализовывать новую функциональность, подготовье структуру проекта по аналогии с примером выше. Создайте ветку lab-3 и приведите проект к требуемой структуре.

      Возможная структура проекта:

      . |-- bin | `-- .keep |-- .clang-format |-- .gitignore |-- Makefile |-- obj | |-- .keep | `-- src | |-- geometry | | `-- .keep | `-- libgeometry | `-- .keep |-- README.md `-- src |-- geometry | `-- main.c `-- libgeometry |-- parser.c |-- parser.h |-- lexer.c `-- lexer.h

      Ваш набор файлов может отличаться.

      Добавьте каталог src в include path (опция -I компилятора). Не используйте относительные пути для подключения заголовочных файлов.

      Для примера рассмотрим файл geometry/main.c .

      #include "../libgeometry/parser.h" 

      При использовании относительных путей их придется менять при перемещении клиентского файла в другой каталог. Например, при перемещении geometry/parser.c -> geometry/parser/parser.c относительный путь к файлу изменится:

      #include "../../libgeometry/parser.h" 

      Заголовочные файлы должны подключаться единообразно независимо от физического расположения всего дерева исходников.

      #include  

      Требования к работе:

      1. Компилировать приложение следует с опциями -Wall -Werror
      2. Для сборки приложения должно быть достаточно команд git clone && cd geometry && make .
      3. При изменении одного файла с исходным кодом должен перекомпилироваться только он и зависящие от него артефакты. При изменении заголовочного файла должны перекомпилироваться все файлы, в которые он подключен.
      4. Если в исходниках не было изменений, то при повторном запуске make не должно выполняться никаких сборочных операций.
      5. Makefile должен содержать цель clean для удаления артефактов сборки. Цель должна выполняться, даже если в корне репозитория создан файл с именем clean .
      6. В заголовочных файлах должны быть #include guard или #pragma once.

      Настройка автоматических сборок¶

      Для настройки автоматических сборок можно использовать следующий шаблон.

      name: Build on: push jobs: build: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Check codestyle run: git ls-files *. | xargs clang-format -i --verbose && git diff --exit-code - name: Build application run: make 

      Подробности см. в документации GitHub Actions.

      Для проверки создайте отдельную ветку lab-3-fail и попробуйте закоммитить в нее неотформатированный или некомпилируемый код. Убедитесь, что сборка не проходит.

      Сборка не проходит, если хотя бы одна команда завершилась с ненулевым кодом.

      Разберем подробнее команду:

      git ls-files *.c,h> | xargs clang-format -i --verbose && git diff --exit-code

      поскольку вам может понадобиться адаптировать ее для своего проекта.

        git ls-files *. раскрывается оболочкой в git ls-files *.c *.h , см Brace Expansion в bash(1). Выводит в stdout список файлов, соответствующих маскам. Пример:

      src/hello/main.c src/libhello/hello.c src/libhello/hello.h 
      1. Принимает список аргументов из командной строки.
      2. Читает список строк из stdin и добавляет их аргументами к формируемой команде.
      3. Выполняет собранную команду.

      В нашем примере получим команду:

      clang-format -i --verbose src/hello/main.c src/libhello/hello.c src/libhello/hello.h

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

      Реализация функциональности¶

      Теперь, когда структура проекта подготовлена, можно реализовать функциональность приложения в соответствии со своим вариантом. После завершения работы ветку lab-3 можно смержить в main с опцией --no-ff и передать на ревью.

      Контрольные вопросы¶

      1. В чем преимущества правильно написанного Makefile перед простым скриптом сборки вида gcc -Wall -Wextra -Werror *.c -o app ?
      2. Как make определяет необходимость выполнения команд?
      3. Что такое и зачем используется CI?

      © Copyright 2017−2021, Evgeny Pimenov; 2021-2023, Elizaveta Tokmasheva Revision 7bef7393 .

      Built with Sphinx using a theme provided by Read the Docs.
      Read the Docs v: 2023

      Versions 2023 2021 2020 Downloads On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.

      Как собрать apk для android из сорцов с github?

      Есть простой способ для людей, не умеющих в програминг?
      Вот скачал я с github zip-архив, распаковал, внутри обнаружились файлики Android.mk, CleanSpec.mk и кучка директорий с непонятными файлами внутри.
      Какие пакеты установить в систему и что запустить, чтобы на выходе получился apk для девайса с процессором MediaTek MT6795?

      Lavos ★★★★★
      29.02.16 09:06:34 MSK

      самый простой способ - поставить android studio + android sdk, способ посложней - поставить android sdk и сделать свой кастомный билд.

      umren ★★★★★
      ( 29.02.16 10:09:13 MSK )
      Ответ на: комментарий от umren 29.02.16 10:09:13 MSK

      Судя по мейк файлам это нужен ndk, а не SDK. Но лучше если автор даст линк на проект.

      takino ★★★★★
      ( 29.02.16 10:33:51 MSK )

      Дай линк на проект.

      Судя по Android.mk, смотри в сторону ndk-build. Если вообще не нужно трогвть жабку и в целом лениво собирать заново, то поставь apktool, декомпиль apk, подмени получившиеся на выходе от ndk-build сошки и компиль обратно. Не забудь подписать.

      Если же надо, то ищи жабовый проект и собирай его антом(или градлом, если градл головного мозга).

      a1batross ★★★★★
      ( 29.02.16 10:43:52 MSK )

      С ndk простых способов нет, в принципе.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *