dlib 的链接问题:使用 -fPIC 重新编译

Posted

技术标签:

【中文标题】dlib 的链接问题:使用 -fPIC 重新编译【英文标题】:Linking problems with dlib: recompile with -fPIC 【发布时间】:2021-09-03 01:44:58 【问题描述】:

我想使用依赖于dlib 的this ROS 包。我用catkin build 编译,但我猜我在链接时遇到了这个错误:

/usr/bin/ld: /usr/lib/libdlib.a(threads_kernel_shared.o): relocation R_X86_64_PC32 against symbol `_ZN4dlib21threads_kernel_shared14thread_starterEPv' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
make[2]: *** [/home/alberto/tiago_dual_public_ws/devel/.private/gazr/lib/libgazr.so] Error 1
make[1]: *** [CMakeFiles/gazr.dir/all] Error 2
make: *** [all] Error 2

我已经在我的 Ubuntu 18.05 (ROS Melodic) 机器上使用 sudo apt-get install libdlib-dev 安装了 dlib。我怎么解决这个问题? dlib 文档和 repo 指令对我没有多大帮助。

提前致谢。

【问题讨论】:

尝试添加-mcmodel=large编译标志。 在哪里?这就是我通过catkin build gazr -mcmodel=large usage: catkin [-h] [-a] [--test-colors] [--version] [--force-color | --no-color] [build | clean | config | create | env | init | list | locate | profile] ... catkin: error: unrecognized arguments: -mcmodel=large 得到的结果 我对catkin不是很熟悉。一个肮脏的方法可能是编辑一个make文件并在那里添加这个参数。此参数应传递给编译器(CMake 中的CMAKE_CXX_FLAGS)。 好的,谢谢。我尝试在 CMakeLists 中添加 set(CMAKE_CXX_FLAGS "-mcmodel=large" ),但没有任何变化。 更新:我已经能够通过修改 CMakelists 这一行来编译:target_link_libraries(gazr dlib $OpenCV_LIBRARIES) 【参考方案1】:

我找到了 2 个可能的解决方案。

    使用sudo apt-get install libdlib-dev 安装 dlib

在这种情况下,您应该将 dlib 链接到您的库目标,例如 target_link_libraries(gazr dlib $OpenCV_LIBRARIES)

记得使用find_package(dlib REQUIRED)

    从源代码安装 dlib

也可以直接使用 dlib source file。在这种情况下,您需要使用 add_subdirectory(your_path/dlib dlib) 将 dlib 源目录添加到项目中,并将其添加到库 target_link_libraries(gazr dlib $OpenCV_LIBRARIES)

注意:在这种情况下,您不应使用find_package(dlib REQUIRED)

希望对您有所帮助!

【讨论】:

以上是关于dlib 的链接问题:使用 -fPIC 重新编译的主要内容,如果未能解决你的问题,请参考以下文章

dlib问题的Android人脸识别

使用 dlib 库编译

Dlib 正面人脸检测在 IOS 中不起作用。?

如何在 MacOS High Sierra 上将 X11 链接到 qt 项目

为啥我在编译 dlib python 接口时得到“dlib is not going to use CUDA”

windows中使用mingw64编译dlib的c++