Создайте общую библиотеку для dlib

Следуя инструкциям по компиляции dlib с помощью cmake (здесь), создается статическая библиотека dlib:

cd examples
mkdir build
cd build
cmake ..
cmake --build . --config Release

Как я могу указать cmake для создания общей (.so) библиотеки?


person ManiAm    schedule 30.11.2015    source источник


Ответы (2)


Если вы хотите создать файл .so, сделайте следующее:

cd dclib/dlib
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=1 ..
make
sudo make install

В системе unix это установит dlib для всей системы. Это означает установку файла .so, а также файлов заголовков, чтобы вы могли компилировать программы с помощью такой команды, как g++ main.cpp -ldlib. Наконец, в системах Linux вам также потребуется запустить sudo ldconfig после установки любых новых общих библиотек.

Однако для большинства пользователей я бы рекомендовал использовать CMake, как показано в примерах. Таким образом, вы сможете включать и отключать режимы отладки в любое время, а также упростите распространение проекта как в исходном, так и в скомпилированном виде. Например, если вы хотите компилировать в Windows, общие библиотеки определенно не подходят. Более того, использование CMake, как показано в примерах, всегда будет работать просто и без какой-либо настройки.

person Davis King    schedule 30.11.2015
comment
Спасибо Дэвис! Последняя строчка у меня не работает. Кажется, что нет правила для целевой установки. Я запускаю make install в папке сборки. - person ManiAm; 30.11.2015
comment
Это не создает для меня никаких файлов .so в Linux (Ubuntu 16.04). Просто помещает файл .a в /usr/local/lib/. locate libdlib просто возвращает: /usr/local/lib/libdlib.a - person ndtreviv; 18.09.2018
comment
Ага. Эти инструкции датированы. Я только что исправил их. - person Davis King; 18.09.2018
comment
@DavisKing Как связать файл примера, скажем, face_recognition_ex.cpp? Я создал файл -o, используя g++ -c -I../ -std=c++11 dnn_face_recognition_ex.cpp Затем, чтобы связать, я попробовал g++ dnn_face_recognition_ex.o -o dnn_face_recognition_ex -ldlib, но получил эту ошибку ld: library not found for -ldlib - person Sleeba Paul; 09.11.2018

Согласно dlib/CMakeLists.txt, автономная (не из examples) сборка dlib также создает разделяемую библиотеку с именем dlib-shared:

mkdir shared_build # Build directory can be any
cd shared_build
cmake ..
cmake --build . --config Release
make install # Install library for make it acessible for others

Чтобы использовать эту библиотеку в примерах, вам необходимо добавить определение библиотеки dlib в ваш examples/CMakeLists.txt перед include(../dlib/cmake).

примеры/CMakeLists.txt:

...
PROJECT(examples)

add_library(dlib SHARED IMPORTED) # Imported(!) dlib target
set_target_properties(dlib PROPERTIES IMPORTED_LOCATION "<full path to the installed dlib-shared library file>")

# Now it is safe to include other dlib infrustucture - it won't build dlib again.
include(../dlib/cmake)
...
person Tsyvarev    schedule 30.11.2015
comment
Это не то, как вы компилируете разделяемую библиотеку dlib. - person Davis King; 30.11.2015
comment
Кроме пропущенного make install (просто забыл об этом, думая, что это само собой разумеется), что не так с моим ответом? - person Tsyvarev; 30.11.2015
comment
Оператор add_library не будет работать разумным образом. - person Davis King; 30.11.2015
comment
The add_library statement is not going to work in a sensible way - Почему? add_library(... IMPORTED) — один из распространенных способов использования сторонних библиотек. - person Tsyvarev; 30.11.2015
comment
Если вы хотите использовать cmake для связи с установленной библиотекой, используйте команду cmake find_package. Или, по крайней мере, не включайте dlib/cmake. Это для статических сборок. - person Davis King; 30.11.2015
comment
That's for static builds. - Почему dlib/cmake предназначен только для статической сборки? Я не нашел никаких доказательств этого, изучив код. Причина использования add_library(dlib SHARED IMPORTED) именно в сочетании с include(dlib/cmake), который делает полезные вещи помимо ссылки. Подход find_package() в этом случае не сработает, так как он объявляет dlib цель как статическую, поэтому пример снова будет статически связан. - person Tsyvarev; 30.11.2015