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

Create a shared lib that depends on dlib using Cmake

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

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

DLib 网站给出的用法示例总是link静态库。

这是我目前拥有的:

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)

link人这样抱怨:

/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 但也没有成功 link 这个。

答案似乎是 (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) 

然后,在您的代码中,包括 headers 如下:

#include <dlib/your_dlib_header_here.h>