Как лучше всего организовать код моего проекта C и его внешние библиотеки?

Я начинаю новый проект C, который в основном основан на OSS. Он также будет на SourceForge, и я хотел бы воспользоваться этой возможностью, чтобы изучить устоявшиеся передовые методы организации такого рода кода. Я использую такие библиотеки, как libcurl и libz, и я скомпилирую их с помощью MinGW и MSYS.

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

  • lib, потому что это библиотеки. Однако в UNIX-мире «lib» имеет другое значение.
  • src, потому что это исходные файлы.
  • 3rdparty, потому что я этого не писал.

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

Как мне это сделать? Существуют ли установленные правила, которым я должен следовать? Они где-то записаны?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
2 645
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Во-первых, для внешних библиотек я бы использовал vendor, но это всего лишь предпочтение.

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

Вы также можете статически скомпилировать эти библиотеки в свою программу.

На предыдущей работе стандарт заключался в установке их в каталог с именем 3rdparty и сборке библиотек прямо там (в 3rdparty / LIBNAME / Debug и т. д.).

Мы используем что-то с суффиксом _ext или _EXT (например, MyProject_EXT), чтобы указать, что он является внешним по отношению к нашему проекту для хранения исходного кода внешних пакетов, с которыми мы связываемся.

Я согласен с Питером. Внешние библиотеки не следует встраивать в корень системы, так как они могут вызвать конфликты. Я бы создал их в их каталоге, а затем установил бы в каталог / lib (или, возможно, / extlib), который является уникальным для вашего приложения, и связал бы их там.

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

Другие вопросы по теме