了解.cbproj文件中的包导入

Jef*_*ite 12 linker c++builder c++builder-2010 runtime-packages

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

LinkPackageImports

LinkPackageStatics

AllPackageLibs

PackageLibs

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

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

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

Jef*_*ite 19

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

PackageImports - 在IDE的"项目选项"中显示为"运行时包"列表.如果在IDE中的"运行时包"列表中添加或删除任何内容,则会更新此标记以反映该标记.如果此标记为空或缺少cbproj文件,则会自动填充与RAD Studio中安装的所有设计时软件包关联的所有运行时软件包的列表.从命令行构建时,此标记无效.IDE似乎只使用PackageImports标记来计算它实际要链接的库.

在此列表中放置库不会(本身)创建任何新的依赖项; 你本质上是在告诉IDE"如果你必须链接任何这些库,请动态链接它们而不是静态链接".

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

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

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

PackageLibs - 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部分的lib)和LinkPackageImports(要添加到libfiles部分的libs).这些标记的内容由IDE从AllPackageLibs和PackageImports计算,但如果需要从命令行进行链接,则可以在.cbproj中手动设置它们.

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

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