gpt4 book ai didi

linker - 了解 .cbproj 文件中的包导入

转载 作者:行者123 更新时间:2023-12-04 00:44:57 28 4
gpt4 key购买 nike

我正在使用 Embarcadero RAD Studio 2010 (C++)。项目文件 (.cbproj) 有五个不同的标签,其中包含 .bpis 或 .libs 的列表。我想要一些有关链接器如何使用这些库文件列表中的每一个的信息(使用或不使用运行时包构建时)。

LinkPackageImports

LinkPackageStatics

AllPackageLibs

软件包库

包裹进口
我想我已经理解了最后一个。它包含可以从 IDE 中的项目属性设置的运行时包列表。

这个问题的动机是我试图从我的应用程序中消除不必要的依赖。 .cbproj 中的这五个标签似乎都包含任意组合的不同库和 bpi。有些库我知道我不需要,有些库我认为我不需要。从某些列表中删除一些库似乎没有效果,而从其他列表中删除其他库会导致形式为 [ILINK32 Error] Fatal: Unable to open file 'FILENAME.OBJ' 的链接器错误。

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

最佳答案

我确信这些信息一定存在于某个地方,但我一直无法在任何论坛或文档中找到它。我已经从我自己的实验中推断出所有这些,但我会感谢来自更官方来源的反馈。

包裹进口 -- 这在 IDE 的项目选项中显示为“运行时包”列表。如果您在 IDE 的“运行时包”列表中添加或删除任何内容,此标记将更新以反射(reflect)这一点。如果 cbproj 文件中此标记为空或缺失,它将自动填充与 RAD Studio 中安装的所有设计时包关联的所有运行时包的列表。从命令行构建时,此标记无效。 IDE 似乎仅使用 PackageImports 标记来计算它实际要链接的库。

将库放在此列表中不会(本身)创建任何新的依赖项;您实际上是在告诉 IDE“如果您必须链接这些库中的任何一个,请动态而不是静态链接它们”。

AllPackageLibs -- 这是 IDE 认为项目成功链接所需的所有库的列表。从命令行构建时,此标记无效。如果对项目进行更改(例如添加文件),IDE 将尝试重新计算 AllPackageLibs 的内容。它根据 #pragma link 计算得出s 它在项目的文件中找到。 (我通过注释掉项目中的所有 #pragma link 并注意到在我进行项目修改时没有重新填充 AllPackageLibs 来确定这一点。)

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

LinkPackageImports -- 如果 IDE 在 AllPackageLibs 中找到了一个出现在 PackageImports 中的库,它会决定动态链接该库。在这种情况下,IDE 会将库名称(带有 .bpi 扩展名)复制到 LinkPackageImports。如果从 IDE 构建,此标记将始终从 AllPackageLibs 和 PackageImports 重新计算,因此您在此处手动添加的任何内容都将被链接器忽略。但是,如果从命令行构建,此标记中的所有文件(.libs 或 .bpis)都将被链接并出现在 ilink32 命令行的“libfiles”部分中。

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

任何时候您希望 IDE 为您修改 LinkPackageStatics 或 LinkPackageImports,您都需要先在 IDE 中构建项目;然后对项目选项进行细微更改(并撤消它);然后保存项目。此时,IDE 会将 LinkPackageStatics 或 LinkPackageImports 写出到 cbproj,以便您的项目可以在命令行上链接。

链接库的其他方式 ——
还有几种指定要链接的文件的方法,这些方法不涉及这四个标签。您可以将 .lib 直接添加到项目中(右键单击项目 | 添加...),或者您可以插入行 #pragma comment (lib, "libraryname.lib")在与项目一起编译的文件之一中。

如果您将 .lib 直接添加到项目中,它将与所有其他要链接的库一起出现在命令行中。如果您使用 #pragma comment技巧,库不会出现在命令行上,您将无法看到它已链接(除非使用 tdump 并查看导出)。

摘要

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

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

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

关于linker - 了解 .cbproj 文件中的包导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11786900/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com