Перейти к содержимому

Как собрать библиотеку c из исходников

  • автор:

Как собрать библиотеку c из исходников

Блог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 [10468 просмотров]

Как собрать библиотеку из исходников под x32 разрядную систему?

Написал небольшую программу. Теперь необходимо портировать её для запуска на 32-разрядной системе. Для работы была использована библиотека cURL, которую я собрал из исходников. Как я понимаю, теперь мне нужно пересобрать ей с указанием требуемой системы (видимо, при вызове ./configure нужно указать какой-то параметр). Не могли бы вы подсказать, что именно мне нужно выполнить, для сборки библиотеки?
P.S. программа будет запускаться на процессоре armhf, если это важно.

Отслеживать
задан 23 июл 2017 в 11:11
Андрей Солодовников Андрей Солодовников
718 5 5 серебряных знаков 23 23 бронзовых знака

Вы имеете в виду libcurl (curl.haxx.se)? Обычно во всех дистрибутивах это достигается либо через механизм multilib, либо путём пересборки (для таких, как Gentoo, Buildroot, Yocto и т.п.). Скорее всего вас интересует второй случай, и скорее всего кросс-компиляция. Используйте дистрибутивы в исходниках, там всё это задаётся через общий конфигурационный файл.

23 июл 2017 в 13:56
А вообще, вопрос написан в стиле «у меня подземный стук», а именно много воды и мало конкретики.
23 июл 2017 в 13:56

armhf — это не просто «32-разрядная система», это ещё и «не-x86 система». Т.е. Ваша утилита должна быть скомпилирована под ARM, и для этого надо иметь подходящий компилятор и все необходимые библиотеки. Для начала можно погуглить «cross compiler».

24 июл 2017 в 9:04

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

нужно пересобрать её с указанием требуемой системы (видимо, при вызове ./configure нужно указать какой-то параметр)

Если это «нормальный» скрипт configure, то у него должен быть параметр —target= Под словом «платформа» понимается триада, разделённая знаками «-«, которая кодирует архитектуру железа, целевую ос и вариант API этой ос.

Запустите ./configure —help что бы узнать, как получить полный список поддерживаемых целей.

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

Как собирать статические библиотеки из исходников?

Здравствуйте!
Подскажите пожалуйста, как собирать lib файлы
Книга подсказала мне, что лучше всего собирать исходники на той машине, где я собираюсь программировать, но делать такого мне не доводилось, а уж тем-более компилировать чужой код, в неизвестный мне тип файла

Структура исходников GLUT

5c225592d35b8535487414.png

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

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

1 комментарий

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

Конкретно GLUT не собирал, но другие библиотеки с открытыми исходниками регулярно приходится.
Самый простой вариант для MSVC — использовать микрософтовский менеджер пакетов vcpkg. У него уже есть в пакетах freeglut. Если это то что вам нужно, то рекомендую установить vcpkg с помощью него собрать glut и можете использовать.
Если этот вариант не подходит — изучайте документацию по сборке конкретно вашей версии под msvc. Вижу, что есть файл readme.win — там, скорее всего есть описание сборки под винду. Так же вижу файл glutmake.bat — видимо это запуск процесса сборки под винду.

Если используете mingw, то там обычно работают сценарии сборки для Linux:
.\configure
make
make install
Но я в этом случае использую msys2 + mingw — в msys2 входит свой менеджер пакетов pacman, устанавливаете нужную библиотеку с его помощью (аналогично как это делается в линуксе).

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

Решения вопроса 1
Alexander Movchan @Alexander1705

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

Для C/C++ де-факто стандрата сборки нет, но есть несколько систем сборки, которые обычно используються:

make — очень простая утилита, но неудобно для больших проектов.
Можно определить по наличию файла Makefile. Иногда этот файл генерируеться скриптом configure.
Если есть Makefile, запускаем:
$ make
Удалить сгенерированные файлы (чтобы запустить сборку заново):
$ make clean

cmake— более высокоуровневая система сборки, генерирует проекты для IDE или те же Makefile.
Можно определить по наличию CMakeLists.txt

mkdir cmake-build # Создаём папку для сгенерированных файлов, чтобы не смешивались с исходниками # Это называеться out-of-source build cd cmake-build # Генерируем проект или Makefile cmake .. # Запускаем билд, можно просто запустить make cmake --build .

qmake — система сборки разработаная для сборки Qt и проектов использующих Qt.
Можно определить по наличию .pro файлов. Билдим так:

qmake make

В вашем случае используеться make.

Библиотеки в Си. Сборка программы со статической и динамической библиотеками

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

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

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

При компиляции программы библиотеки подключаются линковщиком, который вызывается gcc . Если программе требуются только стандартные библиотеки, то дополнительных параметров линковщику передавать не надо (есть исключения). Он «знает», где стандартные библиотеки находятся, и подключит их автоматически. Во всех остальных случаях при компиляции программы требуется указать имя библиотеки и ее местоположение.

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

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

Пример создания библиотеки

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

Также у нас будет проект, использующая эту библиотеку. Он тоже будет включать два файла.

В итоге, когда все будет сделано, схема каталогов и файлов будет выглядеть так:

Схема проекта с библиотекой

Пусть каталоги library и project находятся в одном общем каталоге, например, домашнем каталоге пользователя. Каталог library содержит каталог source с файлами исходных кодов библиотеки. Также в library будут находиться заголовочный файл (содержащий описания функций библиотеки), статическая ( libmy1.a ) и динамическая ( libmy2.so ) библиотеки. Каталог project будет содержать файлы исходных кодов проекта и заголовочный файл с описанием функций проекта. Также после компиляции с подключением библиотеки здесь будет располагаться исполняемый файл проекта.

В операционных системах GNU/Linux имена файлов библиотек должны иметь префикс «lib», статические библиотеки — расширение *.a , динамические — *.so .

Для компиляции проекта достаточно иметь только одну библиотеку: статическую или динамическую. В образовательных целях мы получим обе и сначала скомпилируем проект со статической библиотекой, потом — с динамической. Статическая и динамическая «разновидности» одной библиотеки по-идее должны называться одинаково (различаются только расширения). Поскольку у нас обе библиотеки будут находиться в одном каталоге, то чтобы быть уверенными, что при компиляции проекта мы используем ту, которую хотим, их названия различны ( libmy1 и libmy2 ).

Исходный код библиотеки

#include void rect(char sign, int w, int h)  putchar('\n'); } for (i = 0; i  w; i++) putchar(sign); putchar('\n'); } void diagonals(char sign, int w)  int i, j; for (i = 0; i  w; i++) { for (j = 0; j  w; j++) { if (i == j  putchar('\n'); } }

В файле figure.c содержатся две функции — rect и diagonals . Первая принимает в качестве аргументов символ и два числа и «рисует» на экране с помощью указанного символа прямоугольник заданной ширины и высоты. Вторая функция выводит на экране две диагонали квадрата («рисует» крестик).

#include void text(char *ch) { while (*ch++ != '\0') putchar('*'); putchar('\n'); }

В файле text.c определена единственная функция, принимающая указатель на символ строки. Функция выводит на экране звездочки в количестве, соответствующем длине указанной строки.

void rect(char sign, int width, int height); void diagonals(char sign, int width); void text(char *ch); 

Заголовочный файл можно создать в каталоге source , но мы лучше сохраним его там, где будут библиотеки. В данном случае это на уровень выше (каталог library ). Тем самым как бы подчеркивается, что файлы исходных кодов после создания из них библиотеки вообще не нужны пользователям библиотек, они нужны лишь разработчику библиотеки. А вот заголовочный файл библиотеки требуется для ее правильного использования.

Создание статической библиотеки

Статическую библиотеку создать проще, поэтому начнем с нее. Она создается из обычных объектных файлов путем их архивации с помощью утилиты ar .

Все действия, которые описаны ниже выполняются в каталоге library (т.е. туда надо перейти командой cd ). Просмотр содержимого каталога выполняется с помощью команды ls или ls -l .

Получаем объектные файлы:

gcc -c ./source/*.c

В итоге в каталоге library должно наблюдаться следующее:

figures.o mylib.h source text.o

Далее используем утилиту ar для создания статической библиотеки:

ar r libmy1.a *.o

Параметр r позволяет вставить файлы в архив, если архива нет, то он создается. Далее указывается имя архива, после чего перечисляются файлы, из которых архив создается.

Объектные файлы нам не нужны, поэтому их можно удалить:

rm *.o

В итоге содержимое каталога library должно выглядеть так:

libmy1.a mylib.h source

, где libmy1.a — это статическая библиотека.

Создание динамической библиотеки

Объектные файлы для динамической библиотеки компилируются особым образом. Они должны содержать так называемый позиционно-независимый код (position independent code). Наличие такого кода позволяет библиотеке подключаться к программе, когда последняя загружается в память. Это связано с тем, что библиотека и программа не являются единой программой, а значит как угодно могут располагаться в памяти относительно друг друга. Компиляция объектных файлов для динамической библиотеки должна выполняться с опцией -fPIC компилятора gcc :

gcc -c -fPIC source/*.c

В отличие от статической библиотеки динамическую создают при помощи gcc указав опцию -shared :

gcc -shared -o libmy2.so *.o

Использованные объектные файлы можно удалить:

rm *.o

В итоге содержимое каталога library :

libmy1.a libmy2.so mylib.h source

Использование библиотеки в программе

Исходный код программы

Теперь в каталоге project (который у нас находится на одном уровне файловой иерархии с library ) создадим файлы проекта, который будет использовать созданную библиотеку. Поскольку сама программа будет состоять не из одного файла, то придется здесь также создать заголовочный файл.

#include #include "../library/mylib.h" void data(void) { char strs[3][30]; char *prompts[3] = { "Ваше имя: ", "Местонахождение: ", "Пунк прибытия: "}; int i; for (i = 0; i  3; i++) { printf("%s", prompts[i]); fgets(strs[i], 30, stdin); } diagonals('~', 7); for (i = 0; i  3; i++) { printf("%s", prompts[i]); text(strs[i]); } }

Функция data запрашивает у пользователя данные, помещая их в массив strs . Далее вызывает библиотечную функцию diagonals() , которая выводит на экране «крестик». После этого на каждой итерации цикла вызывается библиотечная функция text() , которой передается очередной элемент массива; функция text выводит на экране звездочки в количестве равном длине переданной через указатель строки.

Обратите внимание на то, как подключается заголовочный файл библиотеки: через относительный адрес. Две точки обозначают переход в каталог на уровень выше, т. е. родительский по отношению к project , после чего путь продолжается в каталог library , вложенный в родительский. Можно было бы указать абсолютный путь, например, «/home/pl/c/les22/library/mylib.h». Однако при перемещении каталогов библиотеки и программы на другой компьютер или в другой каталог адрес был бы уже не верным. В случае с относительным адресом требуется лишь сохранять расположение каталогов project и library относительно друг друга.

#include #include "../library/mylib.h" #include "project.h" int main() { rect('-',75,4); data(); rect('+',75,3); } 

Здесь два раза вызывается библиотечная функция rect() и один раз функция data() из другого файла проекта. Чтобы сообщить функции main прототип data также подключается заголовочный файл проекта.

Файл project.h содержит всего одну строчку:

void data(void);

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

gcc -c *.c

При этом не забудьте сделать каталог project текущим!

Компиляция проекта со статической библиотекой

Теперь в каталоге project есть два объектных файла: main.o и data.o . Их надо скомпилировать в исполняемый файл project , объединив со статической библиотекой libmy1.a . Делается это с помощью такой команды:

gcc -o project *.o -L../library -lmy1

Начало команды должно быть понятно: опция -o указывает на то, что компилируется исполняемый файл project из объектных файлов.

Помимо объектных файлов проекта в компиляции участвует и библиотека. Об этом свидетельствует вторая часть команды: -L../library -lmy1 . Здесь опция -L указывает на адрес каталога, где находится библиотека, он и следует сразу за ней. После опции -l записывается имя библиотеки, при этом префикс lib и суффикс (неважно .a или .so ) усекаются. Обратите внимание, что после данных опций пробел не ставится.

Опцию -L можно не указывать, если библиотека располагается в стандартных для данной системы каталогах для библиотек. Например, в GNU/Linux это /lib/ , /urs/lib/ и др.

Запустив исполняемый файл project и выполнив программу, мы увидим на экране примерно следующее:

Выполнение готовой программы

Посмотрим размер файла project :

pl@desk:~/c/les22/project$ ls -l project -rwxrwxr-x 1 pl pl 16352 дек 19 02:02 project

Его размер равен 16352 байт.

Компиляция проекта с динамической библиотекой

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

gcc -o project *.o \ > -L../library -lmy2 -Wl,-rpath. /library/

Здесь в отличии от команды компиляции со статической библиотеки добавлены опции для линковщика: -Wl,-rpath. /library/ . -Wl ‒ это обращение к линковщику, -rpath ‒ опция линковщика, ../library/ ‒ значение опции. Получается, что в команде мы два раза указываем местоположение библиотеки: один раз с опцией -L , а второй раз с опцией -rpath .

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

gcc -o project *.o -L../library -lmy2 \ > -Wl,-rpath,/home/pl/c/library

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

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

pl@desk:~/c/les22/library$ ls -l libmy* -rw-rw-r-- 1 pl pl 3616 дек 19 00:16 libmy1.a -rwxrwxr-x 1 pl pl 15592 дек 19 00:33 libmy2.so

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

Курс с решением задач:
pdf-версия

Как собрать библиотеку из исходников под x32 разрядную систему?

Написал небольшую программу. Теперь необходимо портировать её для запуска на 32-разрядной системе. Для работы была использована библиотека cURL, которую я собрал из исходников. Как я понимаю, теперь мне нужно пересобрать ей с указанием требуемой системы (видимо, при вызове ./configure нужно указать какой-то параметр). Не могли бы вы подсказать, что именно мне нужно выполнить, для сборки библиотеки?
P.S. программа будет запускаться на процессоре armhf, если это важно.

Отслеживать
задан 23 июл 2017 в 11:11
Андрей Солодовников Андрей Солодовников
718 5 5 серебряных знаков 23 23 бронзовых знака

Вы имеете в виду libcurl (curl.haxx.se)? Обычно во всех дистрибутивах это достигается либо через механизм multilib, либо путём пересборки (для таких, как Gentoo, Buildroot, Yocto и т.п.). Скорее всего вас интересует второй случай, и скорее всего кросс-компиляция. Используйте дистрибутивы в исходниках, там всё это задаётся через общий конфигурационный файл.

23 июл 2017 в 13:56
А вообще, вопрос написан в стиле «у меня подземный стук», а именно много воды и мало конкретики.
23 июл 2017 в 13:56

armhf — это не просто «32-разрядная система», это ещё и «не-x86 система». Т.е. Ваша утилита должна быть скомпилирована под ARM, и для этого надо иметь подходящий компилятор и все необходимые библиотеки. Для начала можно погуглить «cross compiler».

24 июл 2017 в 9:04

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

нужно пересобрать её с указанием требуемой системы (видимо, при вызове ./configure нужно указать какой-то параметр)

Если это «нормальный» скрипт configure, то у него должен быть параметр —target= Под словом «платформа» понимается триада, разделённая знаками «-«, которая кодирует архитектуру железа, целевую ос и вариант API этой ос.

Запустите ./configure —help что бы узнать, как получить полный список поддерживаемых целей.

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

Подготовка

Для начала нам понадобятся исходники Scan Tailor’а. Их можно скачать с официального сайта или взять из SVN. В SVN лежат самые последние изменения, и он предназначен прежде всего для разработчиков. Если вы решили взять исходники из SVN, предполагается, что вы представляете себе, что это такое. Если так, то вам достаточно знать SVN URL чтобы вы смогли взять исходники оттуда. Итак, SVN URL у нас такой:

  • Базовый инструментарий для сборки. В Ubuntu есть мета-пакет build-essential, который тянет за собой все основные коомпоненты, необходимые для сборки программ из исходников.
  • Система сборки CMake. Наверняка есть в репозитории вашего дистрибутиве под именем cmake.
  • Qt версии по крайней мере 4.4.0. Она есть в достаточно свежих дистрибутивах, по крайней мере тех, где есть KDE 4.1 или выше, потому как KDE 4.1 требует Qt 4.4. Нужны не только сама библиотека Qt, но и заголовочные файлы, которые как правило находятся в пакетах с именами, заканчивающимеся на -dev. Например в Ubuntu нужный нам пакет называется libqt4-dev. Он потянет за собой и саму библиотеку Qt, если она еще не установлена.
  • Заголовочные файлы от еще нескольких пакетов, а именно libpng (libpng12-dev), libjpeg (libjpeg62-dev), libtiff (libtiff4-dev), libxrender (libxrender-dev). Последний может также называться libXrender-dev, а раньше он был частью libx11-dev. Все эти пакеты определенно есть в репозитории вашего дистрибутива.

Сборка

Открываем консоль (терминал), идем в директорию, куда распаковали исходники Scan Tailor’а, и даем команду «cmake .» (там точка в конце):

cd "/home/username/путь/к/ST" cmake .

Если все прошло успешно, то ближе к концу вы увидите строки:

-- Configuring done -- Generating done

В противном случае какие-то необходимые компоненты не были найдены. Что именно не было найдено, должно быть понятно из сообщений об ошибках. В некоторых случаях компонент имеется, но система сборки все равно не может его найти. В этом случае надо запустить CMake в интерактивном режиме:

ccmake .

И потом вручную указать пути к тем или иным не найденным файлом. ccmake — консольное интерактивное приложение, так что не помешают некоторые инструкции.

ccmake.jpg

  1. Клавишами со стрелками наводим курсор на строкy TIFF_LIBRARY.
  2. Enter.
  3. Вводим правильный путь.
  4. Enter.
  5. [Правим таким же образом остальные ненайденные пути].
  6. Жмем c
  7. Жмем g

Когда CMake наконец отработал успешно, можно приступать к самой сборке:

make

Если сборка завершается с ошибками (не доходит до 100%), задайте вопрос на форуме.

Теперь остается сделать:

sudo make install

На этом этапе вас спросят ваш пароль, так как инсталляция требует прав рута.

На этом сборка и инсталляция закончены, и Scan Tailor готов к запуску. К сожалению, данный процесс инсталляции не предусматривает создания пункта меню, так что вам придется либо создать его самостоятельно, либо запускать его через Alt+F2 набрая там комманду «scantailor» (без кавычек).

Пошаговое руководство. Создание и использование собственной библиотеки динамических ссылок (C++)

В этом пошаговом руководстве показано, как с помощью интегрированной среды разработки (IDE) Visual Studio создать собственную библиотеку динамической компоновки (DLL), написанную на Microsoft C++ (MSVC). Далее в нем показано, как использовать библиотеку DLL из другого приложения C++. Библиотеки DLL (также называемые общими библиотеками в операционных системах на основе UNIX) являются одним из наиболее полезных компонентов Windows. Их можно использовать для обмена кодом и ресурсами, а также для уменьшения размера своих приложений. Библиотеки DLL могут упростить обслуживание и расширение приложений.

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

В этом пошаговом руководстве рассматриваются следующие задачи:

  • Создание проекта библиотеки DLL в Visual Studio.
  • Добавление экспортированных функций и переменных в библиотеку DLL.
  • Создание проекта «Консольное приложение» в Visual Studio.
  • Использование в консольном приложении функций и переменных, импортированных из библиотеки DLL.
  • Запустите готовое приложение.

Как и в случае со статически связанной библиотекой, библиотека DLL экспортирует переменные, функции и ресурсы по имени. Клиентское приложение импортирует имена для использования этих переменных, функций и ресурсов. В отличие от статически компонуемой библиотеки, Windows соединяет импорт в вашем приложении с экспортом в библиотеку DLL во время загрузки или выполнения, а не во время компоновки. Для выполнения этих подключений Windows требуются дополнительные сведения, которые не являются частью стандартной модели компиляции C++. Чтобы предоставить эти дополнительные сведения, компилятор MSVC реализует некоторые специальные расширения Майкрософт для C++. Мы рассмотрим эти расширения далее.

В этом пошаговом руководстве создаются два решения Visual Studio. Первое решение создает библиотеку DLL, а второе — клиентское приложение. Библиотека DLL использует соглашение о вызовах языка C. Ее можно вызывать из приложений, написанных на других языках программирования, при условии, что платформа, соглашения о вызовах и соглашения о связывании совпадают. Клиентское приложение использует неявную компоновку, в рамках которой Windows связывает приложение с библиотекой DLL во время загрузки. Эта компоновка позволяет приложению вызывать функции, предоставляемые библиотекой DLL, точно так же, как функции в библиотеке статической компоновки.

В этом пошаговом руководстве не рассматриваются некоторые общие ситуации. В нем не рассматривается использование библиотеки DLL для C++ другими языками. Он не показывает, как создавать DLL-библиотеки только для ресурсов или как использовать явную компоновку для загрузки библиотек DLL во время выполнения, а не во время загрузки. Уверяем вас, все это можно выполнять с помощью MSVC и Visual C++.

Несмотря на то что код библиотеки DLL написан на языке C++, мы использовали интерфейсы в стиле C для экспортированных функций. Существует две основные причины: во-первых, многие другие языки поддерживают импорт функций в стиле C. Клиентское приложение не должно быть записано на языке C++. Во-вторых, это позволяет избежать некоторых распространенных ошибок, связанных с экспортируемыми классами и функциями-членами. При экспорте классов легко диагностировать ошибки, так как все, что упоминалось в объявлении класса, должно иметь экземпляр, который также экспортирован. Это ограничение применяется к библиотекам DLL, но не к статическим библиотекам. Если классы имеют обычный стиль данных, вы не должны столкнуться с этой проблемой.

Ссылки на дополнительные сведения о DLL см. в статье Создание библиотек DLL на C/C++ в Visual Studio. Дополнительные сведения о явной и неявной компоновке см. в разделе Определение подходящего метода связывания. Дополнительные сведения о создании библиотек DLL C++ для использования с языками, в которых применяются соглашения о компоновках языка C, см. в статье Экспорт функций на языке C++ для использования в исполняемых модулях, исходный код которых написан на языке C. Дополнительные сведения о том, как создавать библиотеки DLL для использования с языками .NET, см. в статье Вызов функций библиотек DLL из приложений Visual Basic.

Необходимые компоненты

  • Компьютер под управлением Microsoft Windows 7 или более поздних версий. Мы рекомендуем использовать последнюю версию Windows для более удобной разработки.

Visual Studio Installer, Desktop development with C++ workload.

  • копия Visual Studio. Сведения о скачивании и установке Visual Studio см. в этой статье. Когда вы запускаете установщик, убедитесь, что установлена рабочая нагрузка Разработка классических приложений на C++. Не беспокойтесь, если вы не установили эту рабочую нагрузку при установке Visual Studio. Вы можете снова запустить установщик и установить ее сейчас.
  • копия Visual Studio. Сведения о скачивании и установке Visual Studio 2015 см. в разделе Установка Visual Studio 2015. Для установки компилятора и средств используйте выборочную установку C++, так как они не установлены по умолчанию.
  • Базовые значения об использовании интегрированной среды разработки Visual Studio. Если вы уже использовали классические приложения для Windows, вы, вероятно, справитесь. Общие сведения см. в обзоре возможностей интегрированной среды разработки Visual Studio.
  • Основные навыки владения языком C++. Не волнуйтесь, мы не будем делать ничего сложного.

В данном пошаговом руководстве подразумевается, что вы используете Visual Studio 2017 версии 15.9 или более поздней. В некоторых более ранних версиях Visual Studio 2017 имелись дефекты в шаблонах кода или использовались разные диалоговые окна пользовательского интерфейса. Чтобы избежать проблем, используйте Visual Studio Installer для обновления Visual Studio 2017 до версии 15.9 или более поздней.

Создание проекта библиотеки DLL

Этот набор задач позволяет создать проект для библиотеки DLL, добавить код и выполнить его сборку. Для начала запустите IDE Visual Studio и выполните вход, если это необходимо. Инструкции немного отличаются в зависимости от используемой версии Visual Studio. Убедитесь, что в элементе управления в верхнем левом углу этой страницы выбрана правильная версия.

Создание проекта библиотеки DLL в Visual Studio 2019

Screenshot of the Create a new project dialog with the Dynamic Link Library template highlighted.

  1. В строке меню выберите Файл>Создать>Проект, чтобы открыть диалоговое окно Создание проекта.
  2. В верхней части диалогового окна для параметра Язык установите значение C++, для параметра Платформа — значение Windows, а для параметра Тип проекта — значение Библиотека.
  3. В отфильтрованном списке типов проектов щелкните Библиотека динамической компоновки (DLL), а затем нажмите кнопку Далее.
  4. На странице Настроить новый проект введите MathLibrary в поле Имя проекта. Примите заданные по умолчанию Расположение и Имя решения. Для параметра Решение задайте Создать новое решение. Снимите флажок Разместить решение и проект в одном каталоге, если он установлен.
  5. Нажмите кнопку Создать, чтобы создать проект.

После создания решения созданный проект вместе с исходными файлами отобразится в окне обозревателя решений в Visual Studio.

Screenshot of the Solution Explorer window with the Math Library project highlighted.

Создание проекта библиотеки DLL в Visual Studio 2017

Screenshot of the New Project dialog box showing Math Library in the Name text box.

  1. В строке меню последовательно выберите пункты Файл>Создать>Проект, чтобы открыть диалоговое окно Новый проект.
  2. На панели слева в диалоговом окне Новый проект выберите Установленные >Visual C++ >Классическое приложение для Windows. В центральной области выберите Библиотека динамической компоновки (DLL). В поле Имя введите MathLibrary. Примите заданные по умолчанию Расположение и Имя решения. Для параметра Решение задайте Создать новое решение. Установите флажок Создать каталог для решения, если он снят.
  3. Нажмите кнопку ОК, чтобы создать проект.

После создания решения созданный проект вместе с исходными файлами отобразится в окне обозревателя решений в Visual Studio.

Screenshot of the Solution Explorer window with the Math Library highlighted.

Создание проекта библиотеки DLL в Visual Studio 2015 и более ранних версий

  1. В строке меню выберите Файл >Создать >Проект.
  2. В левой области диалогового окна Новый проект разверните узлы Установленные>Шаблоны и выберите Visual C++, а затем в центральной области щелкните Консольное приложение Win32. В поле Имя введите MathLibrary. Примите заданные по умолчанию Расположение и Имя решения. Для параметра Решение задайте Создать новое решение. Установите флажок Создать каталог для решения, если он снят. Screenshot of the New Project dialog box showing Math Library in the Name text box.
  3. Нажмите кнопку ​​ОК, чтобы закрыть диалоговое окно Новый проект, и запустите мастер приложений Win32. Screenshot of the Win32 Application Wizard Overview page.
  4. Нажмите кнопку Далее. На странице Параметры приложения в поле Тип приложения выберите пункт DLL. Screenshot of the Win32 Application Wizard Application Settings Page.
  5. Нажмите кнопку Готово , чтобы создать проект.

Когда мастер завершит создание решения, вы сможете увидеть созданный проект вместе с исходными файлами в окне обозревателя решений в Visual Studio.

Screenshot of the Solution Explorer window with the Math Library highlighted.

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

Добавление файла заголовка в библиотеку DLL

  1. Чтобы создать файл заголовка для функций, последовательно щелкните Проект>Добавить новый элемент.
  2. В диалоговом окне Добавление нового элемента в левой области щелкните Visual C++. В центральной области выберите Заголовочный файл (.h). Укажите MathLibrary.h в качестве имени для файла заголовка. Screenshot of the Add New Item dialog with the C plus plus Header File template selected, and MathLibrary.h entered in the Name textbox.
  3. Нажмите кнопку ​​Добавить, чтобы создать пустой файл заголовка, который отображается в новом окне редактора. Screenshot of the empty MathLibrary.h file in the editor.
  4. Замените все содержимое этого файла заголовка следующим кодом:
// MathLibrary.h - Contains declarations of math functions #pragma once #ifdef MATHLIBRARY_EXPORTS #define MATHLIBRARY_API __declspec(dllexport) #else #define MATHLIBRARY_API __declspec(dllimport) #endif // The Fibonacci recurrence relation describes a sequence F // where F(n) is < n = 0, a // < n = 1, b // < n >1, F(n-2) + F(n-1) // for some initial integral values a and b. // If the sequence is initialized F(0) = 1, F(1) = 1, // then this relation produces the well-known Fibonacci // sequence: 1, 1, 2, 3, 5, 8, 13, 21, 34, . // Initialize a Fibonacci relation sequence // such that F(0) = a, F(1) = b. // This function must be called before any other function. extern "C" MATHLIBRARY_API void fibonacci_init( const unsigned long long a, const unsigned long long b); // Produce the next value in the sequence. // Returns true on success and updates current value and index; // false on overflow, leaves current value and index unchanged. extern "C" MATHLIBRARY_API bool fibonacci_next(); // Get the current value in the sequence. extern "C" MATHLIBRARY_API unsigned long long fibonacci_current(); // Get the position of the current value in the sequence. extern "C" MATHLIBRARY_API unsigned fibonacci_index(); 

Этот файл заголовка объявляет некоторые функции для создания обобщенной последовательности Фибоначчи, исходя из двух начальных значений. Вызов fibonacci_init(1, 1) создает знакомую последовательность чисел Фибоначчи.

Обратите внимание на операторы препроцессора в верхней части файла. Новый шаблон проекта библиотеки DLL добавляется _EXPORTS к определенным макросам препроцессора. В этом примере Visual Studio определяет MATHLIBRARY_EXPORTS , когда создается проект DLL MathLibrary.

MATHLIBRARY_EXPORTS При определении MATHLIBRARY_API макроса макрос задает __declspec(dllexport) модификатор для объявлений функций. Этот модификатор предписывает компилятору и компоновщику экспортировать функцию или переменную из библиотеки DLL для использования другими приложениями. Если не определено, например, если MATHLIBRARY_EXPORTS файл заголовка включен клиентским приложением, MATHLIBRARY_API применяет __declspec(dllimport) модификатор к объявлениям. Этот модификатор оптимизирует импорт функции или переменной в приложении. Дополнительные сведения см. в статье dllexport, dllimport.

Добавление реализации в библиотеку DLL

  1. В обозревателе решений щелкните узел Файлы решения правой кнопкой мыши и выберите пункты Добавить >Новый элемент. Создайте новый CPP-файл с именем MathLibrary.cpp, аналогично добавлению нового файла заголовка на предыдущем шаге.
  2. В окне редактора выберите вкладку MathLibrary.cpp, если она уже открыта. Если нет, то в обозревателе решений дважды щелкните файл MathLibrary.cpp в папке Исходные файлы проекта MathLibrary.
  3. В редакторе замените содержимое файла MathLibrary.cpp следующим кодом:
// MathLibrary.cpp : Defines the exported functions for the DLL. #include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier #include #include #include "MathLibrary.h" // DLL internal state variables: static unsigned long long previous_; // Previous value, if any static unsigned long long current_; // Current sequence value static unsigned index_; // Current seq. position // Initialize a Fibonacci relation sequence // such that F(0) = a, F(1) = b. // This function must be called before any other function. void fibonacci_init( const unsigned long long a, const unsigned long long b) < index_ = 0; current_ = a; previous_ = b; // see special case when initialized >// Produce the next value in the sequence. // Returns true on success, false on overflow. bool fibonacci_next() < // check to see if we'd overflow result or position if ((ULLONG_MAX - previous_ < current_) || (UINT_MAX == index_)) < return false; >// Special case when index == 0, just return b value if (index_ > 0) < // otherwise, calculate next sequence value previous_ += current_; >std::swap(current_, previous_); ++index_; return true; > // Get the current value in the sequence. unsigned long long fibonacci_current() < return current_; >// Get the current index position in the sequence. unsigned fibonacci_index()
  1. В окне редактора выберите вкладку MathLibrary.cpp, если она уже открыта. Если нет, то в обозревателе решений дважды щелкните файл MathLibrary.cpp в папке Исходные файлы проекта MathLibrary.
  2. В редакторе замените содержимое файла MathLibrary.cpp следующим кодом:
// MathLibrary.cpp : Defines the exported functions for the DLL. #include "stdafx.h" // use pch.h in Visual Studio 2019 and later #include #include #include "MathLibrary.h" // DLL internal state variables: static unsigned long long previous_; // Previous value, if any static unsigned long long current_; // Current sequence value static unsigned index_; // Current seq. position // Initialize a Fibonacci relation sequence // such that F(0) = a, F(1) = b. // This function must be called before any other function. void fibonacci_init( const unsigned long long a, const unsigned long long b) < index_ = 0; current_ = a; previous_ = b; // see special case when initialized >// Produce the next value in the sequence. // Returns true on success, false on overflow. bool fibonacci_next() < // check to see if we'd overflow result or position if ((ULLONG_MAX - previous_ < current_) || (UINT_MAX == index_)) < return false; >// Special case when index == 0, just return b value if (index_ > 0) < // otherwise, calculate next sequence value previous_ += current_; >std::swap(current_, previous_); ++index_; return true; > // Get the current value in the sequence. unsigned long long fibonacci_current() < return current_; >// Get the current index position in the sequence. unsigned fibonacci_index()

Чтобы убедиться, что все работает, скомпилируйте библиотеку динамической компоновки. Чтобы выполнить компиляцию, последовательно выберите Сборка>Собрать решение. Библиотека DLL и связанные выходные данные компилятора помещаются в папку с именем Debug непосредственно под папкой решения. При создании сборки выпуска выходные данные помещаются в папку с именем Release. Результат должен выглядеть следующим образом.

1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------ 1>pch.cpp 1>dllmain.cpp 1>MathLibrary.cpp 1>Generating Code. 1> Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp 1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== 
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------ 1>stdafx.cpp 1>dllmain.cpp 1>MathLibrary.cpp 1>Generating Code. 1> Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp 1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== 
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------ 1>MathLibrary.cpp 1>dllmain.cpp 1>Generating Code. 1> Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp 1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll 1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.pdb (Partial PDB) ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== 

Поздравляем, вы создали библиотеку DLL с помощью Visual Studio! Далее вы создадите клиентское приложение, которое использует функции, экспортируемые из библиотеки DLL.

Создание клиентского приложения, которое использует библиотеку DLL

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

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

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

Создание клиентского приложения в Visual Studio

Screenshot of the Create a new project dialog box with the Console App option highlighted.

  1. В строке меню выберите «Файл>нового проекта«>, чтобы открыть диалоговое окно «Создать проект».
  2. В верхней части диалогового окна задайте для параметра Язык значение C++, для параметра Платформа значение Windows, а для Типа проектаКонсоль.
  3. В отфильтрованном списке типов проектов щелкните Консольное приложение, а затем нажмите кнопку Далее.
  4. На странице Настроить новый проект введите MathClient в поле Имя проекта. Примите заданные по умолчанию Расположение и Имя решения. Для параметра Решение задайте Создать новое решение. Снимите флажок Разместить решение и проект в одном каталоге, если он установлен.
  5. Нажмите кнопку Создать, чтобы создать клиентский проект.

Создается минимальный проект консольного приложения. Имя главного исходного файла будет совпадать с ранее введенным именем проекта. В этом примере используется имя MathClient.cpp. Вы можете создать проект, но он еще не использует вашу библиотеку DLL.

Создание клиентского приложения в Visual Studio 2017

Screenshot of the New Project dialog box with Installed ></p>
<ol>
<li>Чтобы создать приложение C++, которое использует созданную вами библиотеку DLL, в строке меню выберите <strong>Файл</strong>><strong>Создать</strong>><strong>Проект</strong>.</li>
<li>В левой области диалогового окна <strong>Новый проект</strong> выберите <strong>Классическое приложение Windows</strong> в разделе <strong>Установленные</strong>><strong>Visual C++</strong>. В центральной области выберите <strong>Консольное приложение Windows</strong>. В поле ввода <strong>Имя</strong> укажите имя для проекта <em>MathClient</em>. Примите заданные по умолчанию <strong>Расположение</strong> и <strong>Имя решения</strong>. Для параметра <strong>Решение</strong> задайте <strong>Создать новое решение</strong>. Установите флажок <strong>Создать каталог для решения</strong>, если он снят. Visual C plus plus > Windows Desktop selected, Windows Console Application highlighted, and Math Client typed in the Name text box.» /></li>
<li>Нажмите кнопку <strong>ОК</strong>, чтобы создать проект клиентского приложения.</li>
</ol>
<p>Создается минимальный проект консольного приложения. Имя главного исходного файла будет совпадать с ранее введенным именем проекта. В этом примере используется имя <strong>MathClient.cpp</strong>. Вы можете создать проект, но он еще не использует вашу библиотеку DLL.</p>
<h4>Создание клиентского приложения в Visual Studio 2015</h4>
<p><img decoding=

  • Дважды щелкните в верхней панели диалогового окна Дополнительные каталоги включаемых файлов, чтобы включить элемент управления «Поле ввода». Или щелкните значок папки, чтобы создать новую запись.
  • В элементе управления «Поле ввода» укажите путь к расположению файла заголовка MathLibrary.h. Чтобы перейти к нужной папке, можно выбрать элемент управления с многоточием (. ). Можно также ввести относительный путь от исходных файлов клиента к папке, содержащей файлы заголовков библиотеки DLL. Если вы следовали инструкциям по размещению клиентского проекта в отдельном решении, отличном от библиотеки DLL, относительный путь должен выглядеть следующим образом: ..\..\MathLibrary\MathLibrary Если библиотеки DLL и клиентские проекты находятся в одном решении, относительный путь может выглядеть следующим образом: ..\MathLibrary Если библиотеки DLL и клиентские проекты находятся в других папках, измените относительный путь для соответствия. Или используйте элемент управления «Многоточие» для поиска папки. Screenshot of the Additional Include Directories dialog showing the relative path to the MathLibrary directory.
  • После ввода пути к файлу заголовка в диалоговом окне Дополнительные каталоги включаемых файлов нажмите кнопку ОК. В диалоговом окне Страницы свойств нажмите кнопку OK, чтобы сохранить изменения.
  • Теперь можно добавить файл MathLibrary.h и использовать функции, которые он объявляет, в вашем клиентском приложении. Замените содержимое файла MathClient.cpp, используя следующий код:

    // MathClient.cpp : Client app for MathLibrary DLL. // #include "pch.h" Uncomment for Visual Studio 2017 and earlier #include #include "MathLibrary.h" int main() < // Initialize a Fibonacci relation sequence. fibonacci_init(1, 1); // Write out the sequence values until overflow. do < std::cout while (fibonacci_next()); // Report count of values written before overflow. std::cout

    Этот код может быть скомпилирован, но не скомпилирован. Если вы создаете клиентское приложение, в списке ошибок появится несколько ошибок LNK2019. Это связано с отсутствием некоторых сведений о проекте: вы еще не указали, что проект зависит от библиотеки MathLibrary.lib . И вы не указали компоновщику, как найти файл MathLibrary.lib.

    Чтобы устранить эту проблему, можно скопировать файл библиотеки непосредственно в проект клиентского приложения. Компоновщик сможет найти и использовать его автоматически. Однако если и библиотека, и клиентское приложение находятся в стадии разработки, это может привести к изменениям в одной копии, которые не будут отображаться в другой. Чтобы избежать этой проблемы, можно задать свойство Дополнительные зависимости, чтобы сообщить системе сборки о том, что проект зависит от MathLibrary.lib. Также можно задать путь Дополнительные каталоги библиотек в проекте, включив в него путь к исходной библиотеке при компоновке.

    Добавление библиотеки импорта DLL в проект

    1. Щелкните правой кнопкой мыши узел MathClient в обозревателе решений и выберите Свойства, чтобы открыть диалоговое окно Страницы свойств.
    2. В раскрывающемся списке Конфигурация выберите пункт Все конфигурации, если он еще не выбран. Это гарантирует, что любые изменения свойств применяются к сборкам отладки и выпуска.
    3. В области слева выберите пункт Свойства конфигурации >Компоновщик>Ввод. На панели свойств щелкните раскрывающийся элемент управления рядом с полем ввода параметра Дополнительные зависимости, а затем щелкните Правка. Screenshot of the Property Pages dialog showing the Edit command in the Linker >Input > Additional Dependencies property drop-down.
    4. В диалоговом окне Дополнительные зависимости добавьте MathLibrary.lib в список в верхнем элементе управления "Поле ввода". Screenshot of the Additional Dependencies dialog showing the MathLibrary.lib file.
    5. Нажмите кнопку OK, чтобы вернуться в диалоговое окно Страницы свойств.
    6. В области слева выберите пункт Свойства конфигурации >Компоновщик>Общие. На панели свойств щелкните раскрывающийся элемент управления рядом с полем ввода параметра Дополнительные каталоги библиотек, а затем щелкните Правка. Screenshot of the Property Pages dialog showing the Edit command in the Linker >General > Additional Library Directories property drop-down.
    7. Дважды щелкните в верхней панели диалогового окна Дополнительные каталоги библиотек, чтобы включить элемент управления "Поле ввода". В элементе управления "Поле ввода" укажите путь к расположению файла MathLibrary.lib. По умолчанию он находится в папке с именем Debug непосредственно в папке решения DLL. При создании сборки выпуска файл помещается в папку с именем Release. Можно использовать макрос $(IntDir) , чтобы компоновщик мог найти библиотеку DLL независимо от типа создаваемой сборки. Если вы следовали инструкциям по размещению клиентского проекта в отдельном решении, отличном от проекта DLL, относительный путь должен выглядеть следующим образом: ..\..\MathLibrary\$(IntDir) Если библиотеки DLL и клиентские проекты находятся в других расположениях, измените относительный путь для соответствия. Screenshot of the Additional Library Directories dialog.
    8. Как только вы ввели путь к файлу библиотеки, в диалоговом окне Дополнительные каталоги библиотек нажмите кнопку ОК, чтобы вернуться в диалоговое окно Страницы свойств. Нажмите ОК, чтобы сохранить изменения свойств.

    Ваше клиентское приложение теперь можно компилировать и компоновать, но в нем по-прежнему нет всего необходимого для запуска. Когда операционная система загружает ваше приложение, оно ищет библиотеку DLL MathLibrary. Если она не может найти библиотеку DLL в определенных системных каталогах, в пути среды или локальном каталоге приложения, загрузка завершается сбоем. В зависимости от операционной системы вы увидите сообщение об ошибке следующего вида:

    Screenshot of the error dialog, MathLibrary DLL not found.

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

    Копирование библиотеки DLL в событие после сборки

    Screenshot of the Property Pages dialog showing the post build event command line property.

    1. Щелкните правой кнопкой мыши узел MathClient в обозревателе решений и выберите Свойства, чтобы открыть диалоговое окно Страницы свойств.
    2. В раскрывающемся списке Конфигурация выберите пункт Все конфигурации, если он еще не выбран.
    3. В области слева выберите Свойства конфигурации >События сборки >Событие после сборки.
    4. В области свойств щелкните элемент управления "Поле ввода" в поле Командная строка. Если вы следовали инструкциям по размещению клиентского проекта в отдельном решении, отличном от проекта DLL, введите следующую команду: xcopy /y /d "..\..\MathLibrary\$(IntDir)MathLibrary.dll" "$(OutDir)" Если библиотеки DLL и клиентские проекты находятся в других каталогах, измените относительный путь к библиотеке DLL для соответствия.
    5. Нажмите кнопку OK, чтобы сохранить изменения в свойствах проекта.

    Теперь в вашем клиентском приложении есть все, что нужно для сборки и запуска. Соберите приложение, щелкнув команду Сборка>Собрать решение в меню. Окно Вывод в Visual Studio должно иметь примерно следующий вид в зависимости от используемой версии Visual Studio:

    1>------ Build started: Project: MathClient, Configuration: Debug Win32 ------ 1>MathClient.cpp 1>MathClient.vcxproj -> C:\Users\username\Source\Repos\MathClient\Debug\MathClient.exe 1>1 File(s) copied ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== 

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

    Screenshot of the command window output when you start the client app without debugging.

    Для закрытия командного окна нажмите любую клавишу.

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

    При развертывании приложения необходимо также развернуть используемые им библиотеки DLL. Самый простой способ сделать библиотеки DLL, которые вы создаете или добавляете из сторонних источников, доступными — поместить их в тот же каталог, что и ваше приложение. Это также называется локальным развертыванием приложений. Дополнительные сведения о развертывании см. в разделе Deployment in Visual C++.

    Компиляция и установка программ из исходников

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

    Распаковка

    Программы обычно распространяются в упакованных архивах, это файлы с расширениями

    .tar.gz (иногда .tgz) .tar.bz2

    Нужно понимать отличие между архиватором и упаковщиком.

    Для архивации директорий и файлов используется программа tar; результатом её работы является файл с расширением .tar. Грубо говоря, это копия файловой системы - директорий и файлов с их атрибутами и правами доступа, помещённая в один файл.

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

    Программа tar умеет распаковывать, поэтому не нужно вызывать gunzip, а можно просто указать программе tar, что файл нужно cначала распаковать. Например, команда

    tar -xvf some_app_name>.tar.gz

    сразу распакует и разархивирует. Отличие файлов с расширениями

    .tar.gz
    .tar.bz2

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

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

    cd имя_пакета>*

    Сборка пакета

    Для сборки программ в GNU/Linux используется (в основном) программа make, которая запускает инструкции из Makefile, но поскольку дистрибутивов GNU/Linux много, и они все разные, то для того чтобы собрать программу, нужно для каждого дистрибутива отдельно прописывать пути,где какие лежат библиотеки и заголовочные файлы. Программисты не могут изучать каждый дистрибутив и для каждого отдельно создавать Makefile. Поэтому придумали конфигураторы, которые «изучают» систему, и в соответствии с полученными знаниями создают Makefile. Но на конфигураторе они не остановились и придумали конфигураторы конфигураторов =)…на этом они остановились :-)

    Для сборки нам нужны компиляторы: они прописаны в зависимостях пакета build-essential, так что достаточно установить его со всеми зависимостями. Ещё нужны autoconf и automake.

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

    ./bootstrap
    ./autogen.sh

    Если таких скриптов в архиве не оказалось, то можно выполнить последовательно следующие команды:

    aclocal autoheader automake --gnu --add-missing --copy --foreign autoconf -f -Wall

    Все эти команды используют файл configure.in. После выполнения этих команд создастся файл configure. После этого необходимо запустить конфигуратор для проверки наличия всех зависимостей, а также установки дополнительных опций сборки (если возможно) и просмотра результата установки (опционально- может не быть)

    ./configure

    Конфигуратор построит Makefile основываясь на полученных знаниях и файле makefile.am. Можно передать конфигуратору опции, предусмотренные в исходниках программы, которые позволяют включать/отключать те или иные возможности программы, обычно узнать о них можно командой

    ./configure --help

    Также есть набор стандартных опций, вроде

    --prefix=

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

    --prefix=/usr
    --prefix=/usr/local

    БЕЗ слеша в конце! Теперь можно запустить процесс сборки самой программы командой

    make

    Для сборки достаточно привелегий обычного пользователя. Окончанием сборки можно считать момент, когда команды в консоли перестанут «беспорядочно» выполняться и не будет слова error. Теперь всё скомпилировано и готово для установки.

    Установка

    Усилия потраченные на Правильную установку в последствии с лихвой окупятся в случае удаления или обновления устанавливаемого программного обеспечения.

    Правильная установка(Вариант №1)

    Установка при помощи утилиты checkinstall. Для установки выполните

    sudo apt-get install checkinstall

    Минус данного способа: checkinstall понимает не все исходники, поскольку автор программы может написать особые скрипты по установке и checkinstall их не поймёт.

    Для создания и установки deb-пакета необходимо выполнить

    sudo checkinstall

    Правильная установка(Вариант №2)

    Быстрое создание deb-пакета «вручную».

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

    Производим установку во временную директорию, где получаем весь набор устанавливаемых файлов:

    fakeroot make install DESTDIR=`pwd`/tempinstall

    Создадим в «корне пакета» директорию DEBIAN и сложим в DEBIAN/conffiles список всех файлов, которые должны попасть в /etc:

    сd tempinstall mkdir DEBIAN find etc | sed "s/^/\//" > DEBIAN/conffiles

    После чего создаём файл DEBIAN/control следующего содержания:

    Package: имя_пакета Version: 1.2.3 Architecture: amd64/i386/armel/all Maintainer: Можете вписать своё имя, можете дребедень, но если оставить пустым, то dpkg будет ругаться Depends: Тут можно вписать список пакетов через запятую. Priority: optional Description: Тоже надо что-нибудь вписать, чтобы не кидало предупреждения

    При необходимости там же можно создать скрипты preinst, postinst, prerm и postrm.
    Создаем deb-пакет, для чего выполняем:

    dpkg -b tempinstall

    Получаем на выходе tempinstall.deb, который и устанавливаем

    sudo dpkg -i tempinstall.deb

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

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