链接器 – 了解.cbproj文件中的包导入

前端之家收集整理的这篇文章主要介绍了链接器 – 了解.cbproj文件中的包导入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Embarcadero RAD Studio 2010(C).项目文件(.cbproj)有五个不同的标签,其中包含.bpis或.libs的列表.我想要一些关于链接器如何使用这些库文件列表的信息(构建有或没有运行时包时).

LinkPackageImports

LinkPackageStatics

AllPackageLibs

PackageLibs

PackageImports
我想我已经明白了最后一个.它包含可以从IDE中的“项目属性”设置的运行时包的列表.

这个问题的动机是我正在尝试从我的应用程序中消除不必要的依赖. .cbproj中的这五个标签似乎都包含不同的libs和bpis的任意分类.我知道的一些我不需要的图书馆,我认为我不需要的一些图书馆.从某些列表中删除某些库似乎没有任何效果,而从其他列表中删除其他库会导致链接错误[ILINK32错误]致命:无法打开文件“FILENAME.OBJ”

我正在慢慢地解决所有的链接器问题,但是当我在这五个列表中的一个列表中包含一个库名称时,确切地知道我正在告诉链接器做什么是非常有帮助的.

解决方法

我确信这些信息必须存在于某个地方,但我无法在任何论坛或文档中找到它.我从我自己的实验中推断出所有这一切,但我会从更多的官方来源中获得反馈.

PackageImports – 在IDE中的“项目选项”中显示为“运行时程序包”列表.如果从IDE中的“运行时程序包”列表中添加删除任何内容,则此标记将被更新以反映出来.如果cbproj文件中此标记为空或缺失,则将自动填充与RAD Studio中安装的所有设计时包关联的所有运行时包的列表.当从命令行构建时,此标记不起作用. IDE似乎使用PackageImports标签来计算它实际链接的库.

在此列表中放置一个库不会(本身)创建任何新的依赖关系;您本质上告诉IDE“如果您必须链接任何这些库,请将其动态链接,而不是静态链接”.

AllPackageLibs – 这是IDE列出的所有图书馆,它认为项目需要连接成功.当从命令行构建时,此标记不起作用.如果您更改项目(例如添加文件),IDE将尝试重新计算AllPackageLib的内容.它从项目文件中找到的#pragma链接中计算出来. (我通过评论项目中的所有#pragma链接来确定这一点,并注意到当我进行项目修改时,AllPackageLibs没有被重新填充.)

LinkPackageStatics – 如果IDE在AllPackageLib中找到一个未显示在PackageImports中的库,则它决定静态链接该库.在这种情况下,IDE将自动将库名称复制到LinkPackageStatics.如果从IDE构建,则始终从AllPackageLibs和PackageImports重新计算此标记,因此,手动添加的任何内容将被链接器忽略.但是,如果从命令行构建,此标签(.libs或.bpis)中的所有文件将被链接,并将显示在ilink32的命令行的“objfiles”部分.

LinkPackageImports – 如果IDE在AllImageageLib中找到一个出现在PackageImports中的库,它决定动态链接该库.在这种情况下,IDE会将库名称(.bpi扩展名)复制到LinkPackageImports.如果从IDE构建,则此标记(.libs或.bpis)中的所有文件将被链接显示在ilink32的命令行的“libfiles”部分.

PackageLibs – PackageLibs(.libs或.bpis)中的任何内容将被IDE直接添加到LinkPackageStatics(不管PackageImports包含什么).这些库被添加到来自AllPackageLibs的libs前面的LinkPackageStatics中.命令行构建不受此标记的影响.

无论何时您希望IDE为您修改LinkPackageStatics或LinkPackageImports,您将需要首先在IDE中构建项目;然后对项目选项进行小的更改(并撤消它);然后保存项目.此时,IDE会将LinkPackageStatics或LinkPackageImports写入cbproj,以便您的项目可以在命令行上链接.

链接库的其他方法
还有几种方法来指定不涉及这四个标签的要链接文件.您可以直接将.lib添加到项目(右键单击项目|添加…),或者您可以在其中一个文件中插入行#pragma注释(lib,“libraryname.lib”)项目.

如果将.lib直接添加到项目中,它将显示在所有其他库要链接的命令行上.如果您使用#pragma注释技巧,该库将不会出现在命令行中,您将无法看到它被链接(除了使用tdump并查看导出).

概要

当从命令行链接时,唯一具有任何效果的cbproj标签(LinkPackageStatics(添加到objfiles部分的lib))和LinkPackageImports(libs添加到libfiles部分).这些标签内容由IDE从AllPackageLibs和PackageImports计算,但如果需要从命令行链接,您可以在.cbproj中手动设置它们.

当从IDE连接时,您通常会希望IDE为您管理库.如果需要添加IDE不能自动检测的库,则应在外部编辑器中打开.cbproj文件,并将丢失的库添加到AllPackageLibs标记中.如果您希望库被动态链接,您还应该将库名称添加到“使用运行时包构建”列表(也称为PackageImports).

如果您想确保您动态地链接所有的库,请查看.cbproj文件中的LinkPackageStatics标记.如果列表中有任何库,它们将被静态链接.要解决这个问题,请将这些库的名称复制到PackageLibs标签中(并将其扩展名更改为bpi);然后删除LinkPackageStatics标签.

猜你在找的C&C++相关文章