Я написал библиотеку, которую использовал для компиляции, используя самописный Makefile, но теперь я хочу перейти на cmake. Дерево выглядит следующим образом (я удалил все ненужные файлы):
.
├── include
│ ├── animation.h
│ ├── buffers.h
│ ├── ...
│ ├── vertex.h
│ └── world.h
└── src
├── animation.cpp
├── buffers.cpp
├── ...
├── vertex.cpp
└── world.cpp
Поэтому я пытаюсь скомпилировать исходный код в общую библиотеку, а затем установить его с заголовочными файлами.
Большинство примеров, которые я нашел, компилировали исполняемые файлы с некоторыми общими библиотеками, но никогда не были простыми общими библиотеками. Также было бы полезно, если бы кто-то мог просто сказать мне очень простую библиотеку, которая использует cmake, поэтому я могу использовать это в качестве примера.
c++
compilation
cmake
shared-libraries
Флориан М
источник
источник
Ответы:
Всегда указывайте минимально необходимую версию
cmake
Вы должны объявить проект.
cmake
говорит, что это обязательно, и это определит удобные переменныеPROJECT_NAME
,PROJECT_VERSION
иPROJECT_DESCRIPTION
(эта последняя переменная требует cmake 3.9):Объявите новую библиотечную цель. Пожалуйста, избегайте использования
file(GLOB ...)
. Эта функция не обеспечивает мастерства в процессе компиляции. Если вы ленивы, скопируйте и вставьте выводls -1 sources/*.cpp
:Установите
VERSION
свойство (необязательно, но это хорошая практика):Вы также можете установить
SOVERSION
на большое количествоVERSION
. Такlibmylib.so.1
будет символическая ссылка наlibmylib.so.1.0.0
.Объявите публичный API вашей библиотеки. Этот API будет установлен для стороннего приложения. Рекомендуется изолировать его в дереве проекта (например, поместить его в
include/
каталог). Обратите внимание, что частные заголовки не должны быть установлены, и я настоятельно рекомендую размещать их вместе с исходными файлами.Если вы работаете с подкаталогами, не очень удобно включать относительные пути, такие как
"../include/mylib.h"
. Итак, передайте верхний каталог во включенные каталоги:или
Создайте правило установки для вашей библиотеки. Я предлагаю использовать переменные,
CMAKE_INSTALL_*DIR
определенные вGNUInstallDirs
:И объявить файлы для установки:
Вы также можете экспортировать
pkg-config
файл. Этот файл позволяет стороннему приложению легко импортировать вашу библиотеку:pkg-config
PKG_CHECK_MODULES
pkg_check_modules
Создайте файл шаблона с именем
mylib.pc.in
( для получения дополнительной информации см. Справочную страницу pc (5) ):В вашем
CMakeLists.txt
, добавьте правило для расширения@
макросов (@ONLY
попросите cmake не раскрывать переменные формы${VAR}
):И наконец, установите сгенерированный файл:
Вы также можете использовать функцию cmake
EXPORT
. Однако эта функция совместима только с,cmake
и мне трудно ее использовать.Наконец, все
CMakeLists.txt
должно выглядеть так:источник
mkdir build && cd build/ && cmake .. && sudo make install
(илиsudo make install/strip
установить версию библиотеки с чередованием )..pc
файл, добавьтеRequires: liblog4cxx
в свойmylib.pc
, иначе вы можете просто добавить-llog4cxx
вLibs:
.Этот минимальный
CMakeLists.txt
файл компилирует простую общую библиотеку:Тем не менее, у меня нет опыта копирования файлов в другое место с помощью CMake. Команда file с подписью COPY / INSTALL выглядит так, как будто она может быть полезна.
источник
${CMAKE_CURRENT_SOURCE_DIR}/
вinclude_directories
?Я пытаюсь научиться делать это сам, и кажется, что вы можете установить библиотеку следующим образом:
источник
Во-первых, это макет каталога, который я использую:
После нескольких дней изучения этого, это мой любимый способ сделать это благодаря современному CMake:
После запуска CMake и установки библиотеки нет необходимости использовать Find ***. Cmake files, его можно использовать так:
Вот и все, если он был установлен в стандартном каталоге, он будет найден, и больше ничего не нужно будет делать. Если он был установлен по нестандартному пути, это также легко, просто сообщите CMake, где найти MyLibConfig.cmake, используя:
Надеюсь, это поможет всем так же, как и мне. Старые способы сделать это были довольно громоздкими.
источник