为 dlib 创建共享库

Posted

技术标签:

【中文标题】为 dlib 创建共享库【英文标题】:Create a shared library for dlib 【发布时间】:2016-03-03 22:57:29 【问题描述】:

按照说明使用 cmake (here) 编译 dlib 生成静态 dlib 库:

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

如何指示 cmake 生成共享 (.so) 库?

【问题讨论】:

【参考方案1】:

如果您想制作 .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 这不会为我在 Linux (Ubuntu 16.04) 上的任何地方创建任何 .so 文件。只需将 .a 文件放在 /usr/local/lib/ 中即可。 locate libdlib 只是返回:/usr/local/lib/libdlib.a 是的。这些说明已过时。我刚刚修好了。 @DavisKing 如何链接一个示例文件,比如 face_recognition_ex.cpp?我使用g++ -c -I../ -std=c++11 dnn_face_recognition_ex.cpp 创建了-o 文件然后链接,我尝试g++ dnn_face_recognition_ex.o -o dnn_face_recognition_ex -ldlib 但得到这个错误ld: library not found for -ldlib【参考方案2】:

根据dlib/CMakeLists.txtdlib 的独立(不是来自examples)构建也会创建名为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)

examples/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)
...

【讨论】:

这不是编译 dlib 共享库的方式。 除了错过make install(忘记了,以为不言而喻),我的回答有什么问题? add_library 语句不会以合理的方式工作。 The add_library statement is not going to work in a sensible way - 为什么? add_library(... IMPORTED) 是常用的 3d 方库使用方式之一。 如果你想使用 cmake 链接已安装的库,请使用 cmake 的 find_package 命令。或者至少不包括 dlib/cmake。这适用于静态构建。

以上是关于为 dlib 创建共享库的主要内容,如果未能解决你的问题,请参考以下文章

COMPILE_TIME_ASSERTs都无法将dlib作为共享库引用

具有持久性的共享对象库

如何使共享库符号强大?

我应该如何为共享项目创建管理 github 存储库?

Qt系列文章之三十八(基于QWidget 创建和使用动态dll共享库)

Qt系列文章之三十八(基于QWidget 创建和使用动态dll共享库)