ExtUtils::Liblist - 确定要使用的库以及使用方法
require ExtUtils::Liblist;
$MM->ext($potential_libs, $verbose, $need_names);
# Usually you can get away with:
ExtUtils::Liblist->ext($potential_libs, $verbose, $need_names)
此实用程序接受以 -llib1 -llib2 -llib3
格式表示的库列表,并返回适合包含在扩展 Makefile 中的代码行。可以使用 -L/another/path
格式包含额外的库路径,这将影响对所有后续库的搜索。
它返回一个包含四个或五个标量值的数组:EXTRALIBS、BSLOADLIBS、LDLOADLIBS、LD_RUN_PATH,以及可选的,对实际库文件名数组的引用。除非在 Unix 上,否则其中一些没有意义。请参阅下面关于这些平台特性的详细信息。仅当 $need_names 参数为真时才会返回文件名列表。
可以以三种方式链接依赖库
对于静态扩展
通过 ld 命令,当 Perl 二进制文件与扩展库链接时。请参阅下面的 EXTRALIBS。
对于构建/链接时的动态扩展
通过 ld 命令,当构建/链接共享对象时。请参阅下面的 LDLOADLIBS。
对于加载时的动态扩展
当共享对象加载时,由 DynaLoader 加载。请参阅下面的 BSLOADLIBS。
链接包含此扩展的 Perl 二进制文件时需要链接的库列表。仅包含实际存在的库。这些库被写入文件,并在链接 Perl 时使用。
使用 ld 创建共享库时,可以或必须链接到共享库的库列表。这些可能是静态库或动态库。LD_RUN_PATH 是 LDLOADLIBS 中目录的冒号分隔列表。它作为环境变量传递给链接共享库的进程。
在该平台上运行时动态链接所需的库列表。SunOS/Solaris 不需要此列表,因为 ld 会将信息(来自 LDLOADLIBS)记录到目标文件中。此列表用于创建 .bs(引导)文件。
此模块处理许多系统依赖项,并且代码中包含相当多的特定于体系结构的 if
语句。
在 VMS 下执行的 ext() 版本在几个方面与 Unix-OS/2 版本不同。
输入库和路径规范可以接受或不接受 Unix 链接器使用的 -l
和 -L
前缀。如果不存在任何前缀,则如果令牌实际上是一个目录,则该令牌被视为要搜索的目录,否则被视为要搜索的库。希望其扩展程序可移植到 Unix 或 OS/2 的作者应使用 Unix 前缀,因为 Unix-OS/2 版本的 ext() 需要它们。
在可能的情况下,首选可共享映像,其次是目标库,最后是普通目标文件。根据 VMS 命名约定,ext() 会查找名为 libshr 和 librtl 的文件;它还会查找 liblib 和 liblib 以适应某些移植软件中使用的 Unix 约定。
对于找到的每个库,都会生成一个适用于链接器选项文件的适当指令。返回值是这些指令的空格分隔字符串,而不是链接器命令行中使用的元素。
LDLOADLIBS 包含基于 $potential_libs
找到的库以及 Config.pm 中指定的 CRTL(如果有)。EXTRALIBS 仅包含基于 $potential_libs
找到的库。BSLOADLIBS 和 LD_RUN_PATH 始终为空。
此外,还尝试识别一些常见的 Unix 库名称,并根据需要将其过滤掉或转换为其 VMS 等效项。
通常,ext() 的 VMS 版本应该能够正确处理来自最初为 Unix 或 VMS 环境设计的扩展的输入。如果您遇到问题,或发现可以改进搜索的案例,请告知我们。
在 Win32 下执行的 ext() 版本在几个方面与 Unix-OS/2 版本不同。
如果 $potential_libs
为空,则返回值为空。否则,将由 $Config{perllibs}
指定的库(参见 Config.pm)追加到 $potential_libs
列表中。将在 $potential_libs
、$Config{libpth}
和 $Config{installarchlib}/CORE
中指定的目录中搜索这些库。对于找到的每个库,都会生成一个以空格分隔的完全限定库路径名列表。
输入库和路径规范接受带有或不带有 Unix 链接器使用的 -l
和 -L
前缀。
形式为 -La:\foo
的条目指定 a:\foo
目录,用于查找后面的库。
形式为 -lfoo
的条目指定库 foo
,其拼写可能因您使用的编译器类型而异。如果您使用的是 GCC,它将被转换为 libfoo.a
,但对于其他 win32 编译器,它将变为 foo.lib
。如果通过这些转换后的名称没有找到任何文件,则将再次尝试使用 foo.a
或 libfoo.lib
查找它们,具体取决于分别使用的是 GCC 还是其他 win32 编译器。
如果条目中没有 -L
或 -l
前缀,则如果该条目实际上是一个目录,则将其视为要搜索的目录,否则将其视为要搜索的库。$Config{lib_ext}
后缀将追加到任何不是目录并且没有该后缀的条目。
请注意,-L
和 -l
前缀是**不需要的**,但希望其扩展程序可移植到 Unix 或 OS/2 的作者应该使用这些前缀,因为 ext() 的 Unix-OS/2 版本需要它们。
条目不能是纯对象文件,因为许多 Win32 编译器不会处理库位置的对象文件。
$potential_libs
中以冒号开头并后跟字母数字字符的条目将被视为标志。未知标志将被忽略。
与 /:nodefault/i
匹配的条目将禁用追加在 $Config{perllibs}
中找到的默认库(这应该很少需要)。
与/:nosearch/i
匹配的条目会禁用对其后指定库的所有搜索。-Lfoo
和-lfoo
的翻译仍然会根据需要进行(取决于使用的编译器,如$Config{cc}
所反映),但不会验证这些条目是否为有效的文件或目录。
与/:search/i
匹配的条目会重新启用对其后指定库的搜索。您可以将其放在末尾以启用对$Config{perllibs}
指定的默认库的搜索。
指定的库可能是静态库和导入库(用于链接到 DLL)的混合。由于这两种类型在 Win32 平台上都非常透明地使用,因此我们不会尝试区分它们。
LDLOADLIBS 和 EXTRALIBS 在 Win32 下始终相同,而 BSLOADLIBS 和 LD_RUN_PATH 始终为空(这在将来可能会改变)。
您必须确保任何路径和路径组件都用双引号正确包围,如果它们包含空格。例如,$potential_libs
可以是(字面意思)
"-Lc:\Program Files\vc\lib" msvcrt.lib "la test\foo bar.lib"
注意第一个和最后一个条目是如何用引号保护以保护空格的。
由于此模块最常仅间接从扩展Makefile.PL
文件使用,因此以下是一个示例Makefile.PL
条目,用于将库添加到扩展的构建过程中
LIBS => ['-lgl']
使用 GCC 时,该条目指定 MakeMaker 应该首先在$Config{libpth}
指定的所有位置中查找libgl.a
(然后是gl.a
)。
使用除 GCC 之外的编译器时,上面的条目将搜索gl.lib
(然后是libgl.lib
)。
如果库恰好位于$Config{libpth}
中未指定的位置,则需要
LIBS => ['-Lc:\gllibs -lgl']
以下是一个不太常用的示例
LIBS => ['-lgl', ':nosearch -Ld:\mesalibs -lmesa -luser32']
这指定了对库gl
的搜索,如前所述。如果该搜索未能找到库,它将查看列表中的下一个项目。:nosearch
标志将阻止搜索其后的库,因此它只是将值返回为-Ld:\mesalibs -lmesa -luser32
,因为 GCC 可以直接使用该值及其链接器。
使用 Visual C 编译器时,第二个项目将返回为-libpath:d:\mesalibs mesa.lib user32.lib
。
使用 Borland 编译器时,第二个项目将返回为-Ld:\mesalibs mesa.lib user32.lib
,MakeMaker 会负责将-Ld:\mesalibs
移动到链接器命令行中的正确位置。