此条目特定于 Unix 系统。
在回答问题之前,让我们回顾一下有关共享库的一些要点。多个应用程序或其他库可以使用共享库,而无需将库实际包含在应用程序中,这可以极大地减少应用程序的总大小。当应用程序已安装时,还可以升级共享库。
但是,为了使依赖于共享库的应用程序能够启动,操作系统可能需要在应用程序启动时找到共享库。动态链接器将在系统定义的路径列表中搜索,加载库并解析符号。这意味着您应该更改由 LD_LIBRARY_PATH
环境变量给出的系统定义列表,或将库安装到系统位置。这在开发过程中可能不方便,因为库还没有准备好安装,并且使系统路径混乱可能不理想。幸运的是,在 Unix 上还有另一种方法。
可执行文件可以包含一个额外的库路径列表,该列表将在系统路径之前搜索。这对于开发非常有用,因为构建系统知道所有库的路径,并且可以将它们包含在可执行文件中。这是在 hardcode-dll-paths
功能具有 true
值时完成的,这是默认值。当可执行文件应该安装时,情况就不同了。
显然,安装的可执行文件不应该包含指向开发树的硬编码路径。(install
规则明确地禁用了 hardcode-dll-paths
功能,原因就在于此。)但是,您可以使用 dll-path
功能手动添加显式路径。例如
install installed : application : <dll-path>/usr/lib/snake <location>/usr/bin ;
将允许应用程序找到放置在 /usr/lib/snake
目录中的库。
如果您将库安装到非标准位置并添加显式路径,则可以更好地控制要使用的库。系统位置中具有相同名称的库不会被无意中使用。如果您将库安装到系统位置并且没有添加任何路径,系统管理员将拥有更多控制权。每个库都可以单独升级,并且所有应用程序都将使用新的库。
哪种方法最佳取决于您的情况。如果库相对独立,并且可以被第三方应用程序使用,则应将它们安装在系统位置。如果您有很多库,这些库只能由您的应用程序使用,那么将它们安装到非标准目录并添加显式路径是有意义的,如上面的示例所示。请注意,不同系统的指南在这方面有所不同。例如,Debian GNU 指南禁止任何额外的搜索路径,而 Solaris 指南建议始终使用它们。