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

Linker 为什么链接.so文件需要-ldl,而.dylib文件不需要-ldl?,linker,g++,shared-libraries,glfw,dylib,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 An

我正在为我的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
文件的必要条件?提前谢谢

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

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

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