Где разместить сторонние библиотеки для установки среды разработки Linux c ++? - PullRequest
34 голосов
/ 10 сентября 2010

Я не новичок в C ++, хотя я новичок в Linux. Я использую CMake для предварительной компиляции кроссплатформенного игрового движка с какой-то третьей стороной, но у меня много сомнений по поводу использования библиотек. У меня вопрос как работать со сторонними библиотеками. И куда это девать. Apt устанавливает libs на их официальном месте (/ usr / local, / usr / lib / ..), но я разрабатываю в windows, используя локальные lib, которые находятся в папке в моем каталоге проекта.

Кроме того, мне нужен хороший учебник, чтобы знать правила работы библиотек. например: при попытке скомпилировать мой проект luabind запрашивает liblua.s0.1, но AFAIK нет способа сгенерировать эту библиотеку с источником, предоставленным lua (по крайней мере, с помощью make, make install).

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

update : После прочтения ответов сомбе, более кратким вопросом является следующий. Если я установлю все сторонние библиотеки, как я могу распространять свою программу? Как управлять зависимостями без использования большого файла readme?

Спасибо за все сильный текст

Ответы [ 4 ]

56 голосов
/ 10 сентября 2010

Где разместить библиотеки

Лучшее решение - использовать систему упаковки вашего дистрибутива Linux (apt-get, yum или аналогичную) для установки библиотек из пакетов, предоставляемых дистрибутивом, где это возможно.

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

  • /usr/local (библиотеки под /usr/local/lib, заголовки под /usr/local/include). Это устанавливает библиотеки в масштабе всей системы и, вероятно, является самым простым решением, поскольку тогда вы сможете использовать их без каких-либо дополнительных действий. НЕ устанавливайте библиотеки непосредственно под /usr, так как это повлияет на систему упаковки вашего дистрибутива.
  • В каталоге вашего проекта, как вы это делали в Windows. Это дает преимущества, заключающиеся в том, что вам не требуется доступ с правами root и внесение изменений в масштабах всей системы, но вам придется обновлять пути к своим проектам и пути к библиотекам, а также размещать любые файлы общей библиотеки там, где динамический компоновщик может найти их (используя LD_LIBRARY_PATH или ld.so.conf - см. Ссылку для более подробной информации).

Как работают библиотеки

См. Превосходную библиотеку программирования Дэвида А. Уилера HOWTO . Я бы рекомендовал прочитать это, а затем публиковать любые конкретные вопросы в качестве новых тем.

Как распространять вашу программу

Традиционно программы Unix / Linux не содержат копий своих зависимостей. Вместо этого сами конечные пользователи или разработчики сами устанавливают эти зависимости. Это может потребовать «большого README», как вы сказали, но у него есть несколько преимуществ:

  • Библиотеки разработки могут устанавливаться, управляться и обновляться через менеджер пакетов дистрибутива, вместо того чтобы каждая исходная копия имела свой собственный набор библиотек для отслеживания.
  • В системе есть только одна копия любой данной библиотеки, поэтому есть только одно место, которое необходимо обновить, если, например, обнаружен брешь в безопасности. (Например, рассмотрим хаос, который возник, когда было обнаружено, что zlib , очень широко используемая библиотека сжатия, имеет недостаток безопасности , поэтому каждое приложение, включающее уязвимую версию, должно быть обновлена.)
  • Если ваша программа достаточно популярна (и с открытым исходным кодом или, по крайней мере, свободно доступна), тогда разработчики пакетов для различных дистрибутивов Linux могут захотеть упаковать ее и включить в свой дистрибутив. Сопровождающие пакетов на самом деле не любят связанные библиотеки. Смотрите, например, страницу Fedora по теме .

Если вы распространяете свою программу среди конечных пользователей, возможно, вы захотите предложить пакет (.dpkg или .rpm), который они могли бы просто загрузить и установить без использования исходного кода. В идеале, с точки зрения конечного пользователя, пакет должен быть добавлен в репозитории дистрибутивов (если он с открытым исходным кодом или, по крайней мере, свободно доступен), чтобы пользователи могли загрузить его с помощью своих менеджеров пакетов (apt-get или yum). Это может все усложниться из-за большого количества дистрибутивов Linux, но совместимый с Debian / Ubuntu .dpkg и совместимый с Red Hat / CentOS / Fedora .rpm должен охватывать значительный процент конечных пользователей. Сборка пакетов не слишком сложна, и в Интернете есть хорошие инструкции.

2 голосов
/ 10 сентября 2010

для первой части вашего вопроса, касающегося Windows: в Windows нет стандартного места для библиотек / заголовков, поэтому простое решение: создать свой собственный. Просто предоставьте в вашей системе одну библиотеку lib / и include /, и пусть все ваши проекты используют ее (указав путь в файле cmake, который вы включаете везде). Поместите туда все сторонние библиотеки, например:

ваших проектов:

d:/projects/projectA
d:/projects/projectB

сторонние материалы:

d:/api/lib/lua.lib
d:/api/include/lua/....

(вы даже можете использовать символические ссылки, называемые «соединениями каталогов», если у вас другая версия)

и соответствующий файл cmake:

include_directories( d:/api/include )
link_directories( d:/api/lib )
1 голос
/ 10 сентября 2010

Если вы устанавливаете библиотеки с помощью менеджера пакетов, они, вероятно, все окажутся в нужном месте. Если нет, вы можете получить компилятор для поиска, указав дополнительный путь поиска, используя флаг -L <path>. Вы должны быть в состоянии передать этот дополнительный флаг CMake.

Кстати, -I <path> может использоваться для добавления дополнительного каталога для поиска включаемых файлов.

1 голос
/ 10 сентября 2010

Хорошо, так что это один из основных вопросов, и хотя я сам, возможно, не совсем ясно понял, вот так:

  1. При создании проекта вашему компилятору нужно будет найти заголовочные файлы библиотек. Заголовки должны быть в пути включения.
  2. после завершения компиляции компоновщик будет искать двоичные файлы библиотеки (файлы .so или что-то в этом роде). Они должны быть в пути к библиотеке.

Это основы.

Если у вас есть определенные библиотеки, вы можете добавить их в собственные каталоги lib/ и include/, относящиеся к проекту, и добавить их в путь включения и путь библиотеки соответственно.

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

Небольшой поиск в Google может помочь вам сделать выше с CMake.

Надеюсь, это поможет,
JRH

...