链接器 – 了解.cbproj文件中的包导入
我正在使用Embarcadero RAD Studio 2010(C).项目文件(.cbproj)有五个不同的标签,其中包含.bpis或.libs的列表.我想要一些关于链接器如何使用这些库文件列表的信息(构建有或没有运行时包时).
LinkPackageImports LinkPackageStatics AllPackageLibs PackageLibs PackageImports 这个问题的动机是我正在尝试从我的应用程序中消除不必要的依赖. .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注释技巧,该库将不会出现在命令行中,您将无法看到它被链接(除了使用tdump并查看导出). 概要 当从命令行链接时,唯一具有任何效果的cbproj标签(LinkPackageStatics(添加到objfiles部分的lib))和LinkPackageImports(libs添加到libfiles部分).这些标签的内容由IDE从AllPackageLibs和PackageImports计算,但如果需要从命令行链接,您可以在.cbproj中手动设置它们. 当从IDE连接时,您通常会希望IDE为您管理库.如果需要添加IDE不能自动检测的库,则应在外部编辑器中打开.cbproj文件,并将丢失的库添加到AllPackageLibs标记中.如果您希望库被动态链接,您还应该将库名称添加到“使用运行时包构建”列表(也称为PackageImports). 如果您想确保您动态地链接所有的库,请查看.cbproj文件中的LinkPackageStatics标记.如果列表中有任何库,它们将被静态链接.要解决这个问题,请将这些库的名称复制到PackageLibs标签中(并将其扩展名更改为bpi);然后删除LinkPackageStatics标签. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |