【问题标题】:Why is -ldl needed for linking .so files but not needed for .dylib files?为什么链接 .so 文件需要 -ldl 而 .dylib 文件不需要?
【发布时间】:2018-10-01 05:23:55
【问题描述】:

我正在为我的 opengl 项目链接 glfw3 库。我尝试在 Mac 和 Linux 环境中编译和运行我的代码。在 Linux 中,glfw3 库被存储为 libglfw.so.3.2,而在 Mac 中,它被存储为 libglfw.3.2.dylib

为了在 Mac 中为 g++ 链接这个库,我只需要使用以下代码

g++ -o Animation glad.o Animation.o -L/usr/local/lib -lglfw

在 Linux 中,我必须包含 -ldl,否则会打印错误。

g++ -o Animation glad.o Animation.o -L/usr/lib/x86_64-linux-gnu -ldl -lglfw

为什么-ldl.so 文件的必要条件,而不是.dylib 文件的必要条件?提前致谢!

【问题讨论】:

    标签: linker g++ shared-libraries glfw dylib


    【解决方案1】:

    不同的系统将函数拆分到不同的库中。 POSIX 要求应用程序在使用某些头文件中的函数时链接到某些库:

    请注意,对于大多数库,POSIX 表示在没有此选项的情况下,实现可能会搜索此库。大多数实现使用此权限将至少一些函数放入主 C 库中,因此无需显式链接到 POSIX 强制库即可使用它。结果是在某些系统上您需要链接这些库,而在其他系统上则不需要。

    从技术上讲,Linux(glibc?)解决方案不符合 POSIX 标准,因为 -ldl 未列为使用 <dlfcn.h> 中的函数所需的库。一些库也丢失了(例如-lxnet)。 autoconf 的诞生部分是由于历史 UNIX 实现之间的这种差异:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2018-03-18
      • 2013-12-11
      • 2014-01-22
      • 1970-01-01
      相关资源
      最近更新 更多