共享程序库为开发人员指出了另外一个注意事项。了解不同的系统正在使用的程序库版本很重要。现在,NetBSD 的 Linux 模拟环境正在使用的是 SUSE 7.3 共享程序库。仍然有使用 9.1 共享程序库的代码,但是它们会获得警告,告之它们不能稳定地进行内核级模拟。
模拟环境软件包通常远远跟不上市场的步伐。即使您觉得大部分预期用户都应该拥有了相当新的 Linux 发行版本,但是大批模拟器还是几乎全都有些跟不上时代。
共享程序库还引发了另一个顾虑 —— 不是每个系统都包含全部共享程序库。模拟环境软件包通常不会安装所有最新的共享程序库。而且,更麻烦的是,它们的用户也不太可能有能力轻松地安装所缺少的软件包。
在这些情况下,最大限度地减少对新特性和非核心共享程序库的依赖是一个好办法。模拟器用户可能会遇到这些问题。
不要误以为使用静态程序库就可以保证解决这些问题。静态程序库可能引入其自己的新的依赖,而且不容易检查到它们。如果静态地链接了一个使用某个不可移植的系统调用,那么通过重写算法来避免这个系统调用将没有什么用处。动态链接让您构建的程序能够在更大范围内的系统上运行。
调用其他程序的程序
有一种特别的情形比任何其他情形更令人们头疼,尤其与安装器相关。在很多系统上,调用 /bin/sh 所得到的 shell 不是bash。这就意味着使用 bash 扩展的脚本可能不能在其他系统上运行。
这就陷入了模拟器中的一个特别错综复杂的逻辑中。当执行二进制程序时,操作系统可能知道的足够多,可以核对相关的 Linux 二进制程序的 Linux 路径,而且它可能在那里安装 bash 的一个副本。但是,当您运行一个脚本时,内核不会将其看作是一个 Linux 二进制程序;它发现脚本附带有一个解释程序路径,当尝试加载解释程序时,它将不再运行于模拟模式之下。
可移植 shell 脚本技术在这里得到了应用。当用户运行被模拟的应用程序时,这是要面对的最常见问题之一。安装器可能会因为不是可移植的 shell 脚本而不能运行。
类似于标准的开发,只是更为标准
- 尽可能遵循适当的标准。
- 避免“专门特性”。
- 不要挑战极限(push the envelope)。
而且,只要可以避免,就不要依赖于一个月前刚刚发布的某些东西来构建您的代码。因为那样做将缩小您的有效的目标市场。