我正在通过这个链接上的样例源代码学习网络编程:http://cs.baylor.edu/~donahoo/practical/CSockets/textcode.html。在编译时,我想知道为什么在 Solaris 环境下,我必须在 make 文件中手动链接 socket 和 nsl 库,而在 Linux 机器上却不需要这样做?
使用的文档:http://developers.sun.com/solaris/articles/solaris_linux_app.html
这是因为Linux的libc,glibc(-lc
,默认链接到所有程序)包括POSIX的socket部分; 而在Linux中,nis/nis+
动态库也由libc动态加载。
但在Solaris中,有许多具有基本功能的库不在libc中。(libc、libucb、libmalloc、libsocket、libxnet等)。我认为,这是一种设计解决方案,允许用户只链接他所需的API部分。
在Linux中,还有一些基本库不在libc之内: libaio、librt、libm。
通过单独的库,可以更容易地更新系统的某些部分;并且可以在同一系统中存在几个实现(例如,提供与旧版本UNIX的更好的兼容性/解决方法)的某些库。
这个问题被广泛讨论,例如 http://web.archiveorange.com/archive/v/KcxCHdLNpD6NANxmAt3b http://mail.opensolaris.org/pipermail/opensolaris-code/2007-January/010316.html 他们正在认真考虑将libnsl和libsocket合并到libc中。最好只将当前基于POSIX和其他标准的功能(Unix98等)移动到libc中,将所有兼容性包装器的内容保留在libnsl / libsocket中,以避免libc因20年的Unix向后兼容性工作而变得臃肿。libc.so
中实现的,默认情况下会链接到每个C程序中,而在Solaris中,它是在单独的库中实现的。