使用 Cmake 创建一个依赖于 dlib 的共享库

Posted

技术标签:

【中文标题】使用 Cmake 创建一个依赖于 dlib 的共享库【英文标题】:Create a shared lib that depends on dlib using Cmake 【发布时间】:2018-08-25 21:06:40 【问题描述】:

我正在使用 CMake 构建一个依赖于 dlib 的 C++ 共享库。

虽然我可以使用makemake install 构建和安装共享的dlib,但到目前为止我还没有找到链接到这个共享的dlib 库的方法。

DLib 网站中给出的使用示例总是链接到静态库。

这是我目前所拥有的:

cmake_minimum_required(VERSION 2.8.12)
project(face_align)

set(CMAKE_CXX_STANDARD 11)

find_package(dlib)

add_library(face_align SHARED src/mylib.cpp)
target_link_libraries(face_align dlib::dlib)

链接器这样抱怨:

/usr/bin/ld: cannot find -ldlib::dlib
collect2: error: ld returned 1 exit status
CMakeFiles/face_align.dir/build.make:94: recipe for target 'libface_align.so' failed
make[2]: *** [libface_align.so] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/face_align.dir/all' failed
make[1]: *** [CMakeFiles/face_align.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

如果我从 add_library(face_align SHARED src/mylib.cpp) 中删除SHARED,则项目构建成功。这让我觉得dlib:dlib 指向的是静态库。我看到有一个dlib:dlib_shared,但也没有成功链接到这个。

【问题讨论】:

使用 add_subdirectory(dlib) 你好@DavisKing。谢谢你的评论。未来有没有关于 find_package 功能的计划? 有一个 find_package()。试试最新的 dlib 【参考方案1】:

答案似乎是 (1) 作为静态库链接到 dlib (2) 使链接到 dlib 的代码位置独立

cmake_minimum_required(VERSION 2.8.12)
project(face_align)

set(CMAKE_CXX_STANDARD 11)

# Unfortunately, this only links dlib as static library
add_subdirectory(libs/dlib dlib_build)

add_library(face_align SHARED src/mylib.cpp)
# This makes the target position independent, allowing to link an static library to a dynamic one.
set_target_properties(face_align PROPERTIES POSITION_INDEPENDENT_CODE ON) # This made it work

# Link Dlib
target_link_libraries(face_align dlib::dlib) 

编辑:

此外,在 Linux 中(我还没有在其他 S.O.s 中测试过这个)CMake 有一些魔力,并且在以共享模式安装 dlib 库后:

$ cd $DLIB
$ mkdir build && cd build
$ cmake ../dlib
$ make && make install

可以使用target_link_libraries 简单地添加库,如下所示:

cmake_minimum_required(VERSION 2.8.12)
project(face_align)

set(CMAKE_CXX_STANDARD 11)

add_library(face_align SHARED src/mylib.cpp)
# Link Dlib
target_link_libraries(face_align dlib) 

然后,在您的代码中,包含如下标题:

#include <dlib/your_dlib_header_here.h>

【讨论】:

对我来说,需要在target_link_libraries下设置dlib::dlib

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

依赖于 dlib 的 python 可执行文件不起作用

如何在没有 CMake 的情况下使用 Visual Studio 2013 设置 Dlib?

无法在 python 3.7.6 上安装 DLIB

CMake 使 add_library 依赖于 ExternalProject_Add

为 python 安装 Dlib 库时出错

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