为什么链接 .so 文件需要 -ldl 而 .dylib 文件不需要 -ldl?
Why is -ldl needed for linking .so files but not needed for .dylib files?
我正在为我的 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 要求应用程序 link 在使用某些头文件中的函数时针对某些库:
请注意,对于大多数库,POSIX 表示 实现可能会在没有此选项的情况下搜索此库 。大多数实现使用此权限将至少一些函数放入主 C 库中,因此无需 linking 明确地进入 POSIX-mandated 库即可使用它。结果是在某些系统上您需要 link 针对这些库,但在其他系统上则不需要。
从技术上讲,Linux (glibc?) 解决方案不符合 POSIX,因为 -ldl
未被列为使用 <dlfcn.h>
中的函数所需的库。一些库也丢失了(例如 -lxnet
)。 autoconf
的诞生部分是由于历史 UNIX 实现之间的差异:
我正在为我的 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 要求应用程序 link 在使用某些头文件中的函数时针对某些库:
请注意,对于大多数库,POSIX 表示 实现可能会在没有此选项的情况下搜索此库 。大多数实现使用此权限将至少一些函数放入主 C 库中,因此无需 linking 明确地进入 POSIX-mandated 库即可使用它。结果是在某些系统上您需要 link 针对这些库,但在其他系统上则不需要。
从技术上讲,Linux (glibc?) 解决方案不符合 POSIX,因为 -ldl
未被列为使用 <dlfcn.h>
中的函数所需的库。一些库也丢失了(例如 -lxnet
)。 autoconf
的诞生部分是由于历史 UNIX 实现之间的差异: