Следуя инструкциям по компиляции dlib с помощью cmake (здесь), создается статическая библиотека dlib:
cd examples
mkdir build
cd build
cmake ..
cmake --build . --config Release
Как я могу указать cmake для создания общей (.so) библиотеки?
Следуя инструкциям по компиляции dlib с помощью cmake (здесь), создается статическая библиотека dlib:
cd examples
mkdir build
cd build
cmake ..
cmake --build . --config Release
Как я могу указать cmake для создания общей (.so) библиотеки?
Если вы хотите создать файл .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, как показано в примерах, всегда будет работать просто и без какой-либо настройки.
make install
в папке сборки.
- person ManiAm; 30.11.2015
locate libdlib
просто возвращает: /usr/local/lib/libdlib.a
- person ndtreviv; 18.09.2018
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)
...
make install
(просто забыл об этом, думая, что это само собой разумеется), что не так с моим ответом?
- person Tsyvarev; 30.11.2015
The add_library statement is not going to work in a sensible way
- Почему? add_library(... IMPORTED)
— один из распространенных способов использования сторонних библиотек.
- person Tsyvarev; 30.11.2015
That's for static builds.
- Почему dlib/cmake
предназначен только для статической сборки? Я не нашел никаких доказательств этого, изучив код. Причина использования add_library(dlib SHARED IMPORTED)
именно в сочетании с include(dlib/cmake)
, который делает полезные вещи помимо ссылки. Подход find_package()
в этом случае не сработает, так как он объявляет dlib
цель как статическую, поэтому пример снова будет статически связан.
- person Tsyvarev; 30.11.2015