Файлы fp lib table не содержат библиотек с именем

Обновлено: 04.07.2024

Библиотеки в /usr/lib и в /lib должны быть упакованы отдельно в специальный библиотечный пакет с именем, содержащим название основной библиотеки и major (или soname, см. далее). Эти пакеты не должны содержать никаких бинарных файлов, которые должны быть в другом пакете. Пакеты могут содержать другие файлы (например, документацию или лицензию) при условии, что эти файлы установлены по адресу, специфичному для пакета (например, libfoo2 может установить что-то в /usr/share/doc/libfoo2/ ). Цель состоит в том, чтобы установить libfoo1 и libfoo2 в одну систему.

Прежде всего фундаментально, что исходные rpm сохраняют одно имя без какого-либо major номера, так что git репозиторий содержит только одну ветку каждого пакета.

Когда дистрибутив должен иметь две версии одной библиотеки одновременно (например, qt1 и qt2), то исходные rpm будут разделены, чтобы мы могли включить обе версии в дистрибутив в виде двух разных, независимо поддерживаемых пакетов.

Вот общий пример: следующее происходит, когда библиотека идёт с бинарными или конфигурационными файлами или какими-либо ещё, которые не вписываются ни в основной пакет библиотеки (где должны быть только библиотеки), ни в devel пакет (где должны быть заголовочные и devel библиотеки, такие как .so и .a)).

  • Исходный пакет:
    • foo-2.3.4-4-rosa2012.src.rpm
    • Бинарные пакеты:
      • foo-2.3.4-4-rosa2012.arch.rpm
      • libfoo2-2.3.4-4-rosa2012.arch.rpm
      • libfoo-devel-2.3.4-4-rosa2012.arch.rpm

      Если foo-2.3.4-4-rosa2012.src.rpm создаёт несколько библиотек, то эти библиотеки должны быть упакованы в отдельные файлы: libfoo2-2.3.4-4-rosa2012.arch.rpm, libbar2-2.3.4-4-rosa2012.arch.rpm и т.д. Однако devel файлы могут быть собраны в один пакет. Имя такого пакета может начинаться с lib, однако для 32-битных и 64-битных пакетов желательно иметь разные имена (например, foo-devel и foo64-devel). Обоснование: -devel пакеты не устанавливаются пользователем, поэтому разделение таких пакетов не влияет на пользователя, но может усложнить жизнь разработчику. Отдельные имена для 32-битных и 64-битных -devel пакетов позволяют устанавливать пакеты обеих архитектур в одной системе.

      Если апстримное имя само по себе начинается с lib (например, libxml2 ), то пакет с бинарными файлами можно назвать libfoo-utils или libfoo-tools или как-то похоже, чтобы можно было отличить его от пакета библиотеки.

      Названия для x86_64

      • Бинарные пакеты:
        • foo-2.3.4-4-rosa2012.x86_64.rpm
        • lib64foo2-2.3.4-4-rosa2012.x86_64.rpm
        • lib64foo-devel-2.3.4-4-rosa2012.x86_64.rpm

        Чтобы было проще, используйте %mklibname :

        %mklibname

        Файлы *.la

        Современные libtool отлично работают без *.la файлов, поэтому эти файлы по-умолчанию отбрасываются spec-helper во время сборки. В настоящее время известно несколько исключений, которые включены в код spec-helper. Если вы считаете, что нашли ещё одно исключение, свободно обращайтесь к мейнтейнерам rpmbuild.

        Особые случаи

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

        • Не забывайте всегда проверять soname библиотек ( objdump -x libfoo.so.1 | grep SONAME ), потому что некоторые soname содержат номер версии библиотеки. Например, libfoo-1.2.so.4 . В этом случае пакет должен быть назван libfoo1.2_4-1.2.4-rosa2012 .
        • Пакеты, оканчивающиеся номером, должны быть снабжены "_" перед major. Например, libfoo23_4-1.2-rosa2012 (в этом случае soname будет libfoo23.so.4 ).
        • Нет необходимости помещать каждую библиотеку в отдельный пакет: если пакет содержит несколько библиотек, имя можно взять из основной библиотеки пакета. Если есть проблемы с хранением библиотек в одном пакете (например, их major может отличаться), пакет должен быть разделён.
          • При разбиении библиотек, которые ранее были в одном пакете, вам может потребоваться добавить Obsoletes/Conflicts в новые пакеты, чтобы попросить Urpmi поместить их в одну транзакцию.

          Обновление пакета, который следовал старой политике оформления библиотек

          Provides и conflicts

          Важно понимать, что включение Provides без информации о версии делает невозможным последующее включение информации о версии. Например, " Provides: foo-devel " - НЕ годится. Пожалуйста, используйте " Provides: foo-devel = 1.2.4-3-rosa2012 ".

          Если в дистрибутиве содержится несколько версий библиотеки, и использовано исключение в виде добавления major в название lib -devel пакета, вам нужно добавить conflicts с другими devel пакетами, если их нельзя устанавливать параллельно. Это часто бывает, когда major изменился без переименования заголовочных файлов.

          Добавление старой версии в дистрибутив

          Если пакет обновлён до нового major, и будет замечено, что он не совместим с исходным кодом предыдущего релиза, и пользователи библиотеки не смогут быть прямо пропатчены для использования нового API, то старая библиотека должна поддерживаться параллельно с новой. Процесс создания на примере пакета foo, который обновляется до major 3:

          1. Копируется git foo непосредственно перед обновлением foo2 до major 3. Также изменяется Name на foo2 и имя спек-файла на foo2.spec .
          2. Добавляется 2 (major) к имени devel пакета, например, libfoo2-devel вместо libfoo-devel. Это можно осуществить добавлением параметра %major в %mklibname для %devname .
          3. Редактируются все provides, чтобы в них был major. Например, %name-devel или foo%major-devel .
          4. Добавляется Conflicts: foo-devel , если пакет конфликтует с новым devel пакетом.

          Внесения каких-либо изменений в .spec для новой версии не требуется.

          Пример

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

          Какое-то время назад я опубликовал статью-презентацию об инструменте под названием QEDA. Если кратко, то это утилита для облегчения процесса создания библиотеки электронных элементов.

          Были сделаны полезные выводы, проведена дальнейшая работа, проект развивался. Появился интерфейс коммандной строки (CLI). На сегодняшний день можно говорить о некотором milestone: проект достиг версии 0.1.

          В этот статье я рассмотрю типичный рабочий процесс по созданию платы в среде KiCad и использованием утилиты QEDA.

          КДПВ

          Предупреждение: будут картинки и, как следствие, трафик.

          Кратко напомню, что для работы надо установить Node.js, а затем запустить в консоли (в *nix может потребоваться sudo ):

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

          Описанная ниже разработка ведётся в Ubuntu Linux, но в общем случае (вероятно, с некоторыми поправками) возможна в любой ОС.

          Устройство представляет собой адаптер для подключения Wi-Fi модуля ESP-07 к автопилоту Pixhawk.

          Собственно это и есть центральная часть нашего повествования.

          Если всё установилось без ошибок, то в системе должна была появиться новая утилита коммандной строки. Проверим, что это так — запустим в консоли:

          Если вы видите что-то вроде.

          … значит мы можем продолжать.

          Для начала выберем папку для будущего проекта. В моём случае это будет директория wifi-adapter .

          Шаг 1. Выбор производителя печатных плат

          В моём случае я буду создавать библиотеку элементов с учетом требований конкретного производителя. Конечно, некоторые параметры можно подкрутить в процессе трассировки в EDA, но здесь я покажу, как учитывать производственные возможности на самом первом этапе.

          Итак, для примера возьмём OSH Park. Из существенных для нас являются требования по:

          • минимальному расстоянию между проводниками: 6 mil (0.2 mm) minimum spacing
          • минимальному диаметру отверстия: 13 mil (0.4 mm) minimum drill size
          • минимальной ширине ободка металлизированного отвестия: 7 mil (0.2 mm) minimum annular ring

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

          Создадим папку для будущей библиотеки элементов:

          Теперь используя консольную команду qeda пропишем вышеупомянутые ограничения. Повторюсь, что пока команды не документированы, так что пока буду пояснять их по месту.

          После выполнения этих команд в текущей директории появится файл .qeda.yaml , который хранит все указанные настройки.

          Шаг 2. Прочие настройки

          Мы можем выбрать предпочитаемый способ генерирования посадочных мест (pattern) микросхем: рекомендуемый производителем или по стандарту IPC-7351. По умолчанию задан рекомендуемый производителем (значения по умолчанию задавать в настройках не обязательно, но мы продублируем их для демонстрации возможностей):

          Те элементы, в чьих описаниях не содержится рекомендаций производителя, рассчитываются по стандарту IPC-7351. Стандарт предусматривает три уровня плотности компоновки (density level):

          • Least ( L ) — самый плотный (рекомендуется при ограниченных габаритах печатной платы)
          • Nominal ( N ) — нормальный (рекомендуется в большинстве случаев)
          • Most ( M ) — наименее плотная компоновка (рекомендуется для плат, рассчитанных на жёсткие условия эксплуатации)

          Так как мы не ограничены в габаритах, выбираем наименее плотный вариант:

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

          Также есть возможность настроить следующие параметры (в скобках указаны значения по умолчанию):

          • pattern.clearance.padToMask (0.05): расстояние от края контактной площадки до края маски (раскрытие маски)
          • pattern.minimum.maskWidth (0.2): минимальная ширина пояска маски (имеет приоритет над предыдущим параметром)
          • pattern.lineWidth.silkscreen (0.12): толщина линии в слое шелкографии
          • pattern.fontSize.refDes (1.2): высота шрифта для позиционных обозначений (reference designator)

          Мы оставим эти параметры по умолчанию.

          Кроме этого, есть возможность задать кое-какие настройки будущих условных графических обозначений (УГО) элементов (schematic symbol):

          • symbol.style ('default'): стиль начертания УГО, альтернативный вариант: 'GOST'
          • symbol.gridSize (2.5): размер ячейки сетки привязки
          • symbol.fontSize.refDes (2.5): высота шрифта для позиционных обозначений (reference designator)
          • symbol.fontSize.name (2.5): высота шрифта для наименования элемента
          • symbol.fontSize.pin (2.5): высота шрифта для обозначения выводов

          Их так же трогать не будем.

          Шаг 3. Добавление элементов

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

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

          Добавим ещё символы питания и земли:

          Шаг 4. Генерация библиотеки

          Ну вот мы и подошли к основному и самому простому шагу. Назовём нашу библиотеку wa .

          Если процесс завершился без ошибок, то в текущей директории lib должны появиться две поддиректории:

          • library , содержащая кэшированные YAML-описания используемых элементов
          • kicad с библиотечными файлами, предназначенными для KiCad

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

          Создадим проект KiCad в директории wifi-adapter/board .

          Так как наша библиотека элементов является самодостаточной, можно удалить все библиотеки KiCad'а по умолчанию, и добавить только нашу wa :

          Eeschema Properties

          Schematic

          А в стиле GOST схема выглядела бы так:

          Schematic GOST

          QEDA избавляет от необходимости такого этапа, как ассоциирование посадочных мест условным графическим обозначениям (assign component footprint), так как каждому элементу уже ассоциировано уникальное посадочное место. Иначе говоря, Cvpcb запускать не придётся.

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

          Импортируем netlist, делаем auto-spread.

          Footprints

          Ну а дальше "рисуем остаток совы". Трассировщик из меня не очень, поэтому прошу не судить строго.

          PCB

          PCB 3D

          Генерируем gerber'ы и можно отдавать в производство.

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

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

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

          KiCad может работать под управлением всех основных классических ОС: Windows, Linux, MacOS. При желании можно собрать KiCad самостоятельно из исходных текстов, они полностью открыты и доступны. Во многих дистрибутивах Linux KiCad можно найти в основных или дополнительных репозиториях или установить через flatpak.

          Последняя стабильная версия на данный момент (18 августа 2021 года) 5.1.10, которая выпущена 3 мая 2021 года.

          Внимание! Ни данная статья, ни все последующие, не являются заменой официальной документации. Это не фрагменты официальной документации, а лишь некоторые дополнения, основанные на собственном опыте, которые поясняют новичкам некоторые моменты и помогают разобраться. Читать официальную документацию ОБЯЗАТЕЛЬНО! Я буду в статьях лишь ссылаться на нее, а не повторять там описанное.

          Официальный сайт

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

          При скачивании (во всяком случае, для Windows и MacOS) вам будут предлагать "оказать финансовую помощь". Это нововведение, которое многим не очень нравится. Платить совсем не обязательно, это не требование, а просьба/предложение. KiCad был и остается свободно распространяемым, причем и в исходных текстах. На всякий случай вот прямые ссылки на загружаемые файлы (без просьб "дать денег")

          Это ссылки на последнюю версию 5.1.10. Ссылки официальные.

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

          Установка

          Установка проста. В Windows и MacOS запустите скачанный файл и выберите нужные для установки компоненты KiCad. Новичкам рекомендуется оставить набор по умолчанию.

          В Linux воспользуйтесь менеджером пакетов добавив, при необходимости, нужный репозиторий. Или используйте flatpak. В Gentoo или Arch придется собирать KiCad из исходных текстов.

          В конечном итоге вы получите установленную работоспособную систему. Если библиотеки электронных компонентов в вашей системе не установились вместе с KiCad, или вы отказались от их установки, скачайте необходимые вручную.

          В дальнейшем я буду предполагать, что у вас есть установленный KiCad.

          Основные программные компоненты KiCad

          KiCad это целостная система, но она состоит из отдельных компонентов, которые могут использоваться и по отдельности. Я не буду перечислять абсолютно все компоненты, назову лишь самые основные и полезные.

          Я пытаюсь использовать pyinstaller для создания одного exe-файла моей программы на Python, но когда процесс завершается, exe-файл не может быть запущен. Изучив вывод консоли из процесса, я вижу следующую строку:

          126946 ИНФОРМАЦИЯ: Ищем динамические библиотеки

          Я получаю несколько сотен строк «ПРЕДУПРЕЖДЕНИЕ: lib не найдена: api-ms-win-crt- любое количество разных .dll зависимостей пути к месту сохранения dll или pyd

          Я установил Python, используя конфигурацию по умолчанию, и всегда устанавливал пакеты Python, используя pip. Предполагается, что Pyinstaller прост и не требует большого количества дополнительных шагов, таких как создание файла setup.py, но, похоже, чего-то не хватает, что говорит pyinstaller, где искать эти недостающие библиотеки. Есть ли обходной путь для этого? Или даже лучший python для exe-компилятора, который я должен использовать?

          РЕДАКТИРОВАТЬ: Чтобы предоставить больше информации - Моя программа состоит из 5 модулей, и среди них я использую три сторонних пакета, включая: PyQt5, pandas и ArcGIS. Кроме того, у меня есть два файла sql, которые также являются частью программы. У меня такое ощущение, что pyinstaller может компилировать только простые скрипты и, используя другие пакеты, модули и внешние файлы, он просто создан для такого рода вещей.

          3 ответа

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

          Во-первых, в pyinstaller отсутствует файл «ловушки» для панд, поэтому его необходимо создать вручную. Для меня папка ловушек была расположена здесь: "C: \ Users \ natha \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ site-packages \ PyInstaller \ hooks"

          Внутри этой папки я создал файл с именем hook-pandas.py, и единственным содержимым этого файла была одна строка: hiddenimports = ['pandas._libs.tslibs.timedeltas']

          Я установил Windows 10 SDK, но я не уверен, была ли это только частью проблемы, или на что это повлияло, если что-нибудь. Моя программа была составлена из нескольких модулей, потому что я люблю разделять процессы разных типов в разных файлах. Однако для упрощения я объединил весь свой код в один файл .py и имел только один другой файл, который содержал мой автоматически сгенерированный код графического интерфейса PyQt5 / Qt Designer. Я удалил все импорта, которые читаются как

          Я получил ошибки в нескольких сборках, когда казалось, что pyinstaller не распознает эти вещи. Так что я держал вещи очень прямо, как

          Наконец, когда я пошел компилировать сборку с помощью команды -p, я добавил два пути к файлам; один указывал на корневой каталог моей программы, где был сохранен другой модуль (модуль PyQt5), а второй путь был на «C: \ Users \ natha \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ сайт -пакеты » . Как только эти вещи будут созданы, компиляция будет завершена в обычном режиме, и сборка будет выполнена идеально. Итак, в итоге, ключи к успеху здесь:

          -Убедитесь, что есть файл hook-pandas.py, если в вашем скрипте используется pandas -Обеспечите, чтобы файл hook-pandas.py содержал следующую строку:

          -И убедитесь, что команда -p используется для направления pyinstaller туда, где хранятся ваши пользовательские модули и все пакеты python. Моя команда -p читается так:

          Обратите внимание на двоеточие, разделяющее два пути.

          Я думаю, что это основные вещи для проверки, а второстепенные вещи будут

          Введите импорт, чтобы избежать тех.

          Забавно, что кто-то задал похожий вопрос

          44 минуты назад, но использовал python с excel.

          Во всяком случае, надеюсь, что этот ответ здесь работает, и аудитор / модератор не волнуется об этом; p

          Py to exe Project

          Python: Python 2.7 или Python 3.3+ (в основном все, на чем работает pyinstaller)

          Chrome: запустить пользовательский интерфейс

          Загрузите заархивированную папку

          Откройте cmd / терминал и cd в разархивированную папку (сейчас рекомендуем разместить ее на рабочем столе)

          Выполнить pip install -r requirements.txt

          Запуск приложения

          Запустить run.py . Chrome откроется в режиме приложения с запущенным проектом.

          Использование приложения

          Выберите местоположение вашего скрипта (вставьте или используйте проводник)

          Контур адресного поля станет синим, когда файл существует

          Выберите другие параметры и добавьте такие вещи, как значок или другие файлы

          Нажмите большую синюю кнопку внизу, чтобы преобразовать

          Найдите ваши конвертированные файлы в [unzipped folder] / output, когда закончите

          Передача файла с аргументами

          В качестве альтернативы вы можете выполнить python run.py [filename] . Это откроет окно с именем файла в месте расположения скрипта.

          Вам необходимо установить Windows 10 SDK, а затем обновить путь, чтобы включить dll-файлы ucrt, которые можно найти здесь после установки:

          C: \ Program Files (x86) \ Windows Kits \ 10 \ Redist \ ucrt \ DLLs \ x86

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