为什么链接.so文件需要-ldl但.dylib文件不需要?

时间:2018-10-01 05:23:55

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

我正在为我的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文件却不是必需的?预先感谢!

1 个答案:

答案 0 :(得分:1)

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

请注意,对于大多数库,POSIX表示实现可以在缺少此选项的情况下搜索该库。大多数实现使用此许可权将至少某些功能放入主C库,因此可以在不显式链接到POSIX要求的库的情况下使用它。结果是,在某些系统上,您需要链接这些库,而在其他系统上则不需要。

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