如何:组织生成的项目输出文件
更新:2007 年 11 月
本主题描述了用于组织项目输出文件的最佳做法。如果没有正确设置项目输出文件,则可能出现生成错误。本主题还概述了用于组织项目输出文件的各种替代方法的优点和缺点。
引用 CLR 程序集
使用 #using 引用程序集
您可以使用 #using 指令直接从代码引用程序集,如 #using <System.Data.dll>。有关更多信息,请参见 The #using Directive。
指定的文件可以是 .dll、.exe、.netmodule 或 .obj,只要它是 MSIL 格式的。引用的组件可用任何语言生成。使用此选项,您应该具有对 Intellisense 的访问权限,因为将从 MSIL 中提取元数据。相关的文件必须在项目的路径中;否则,项目将不编译,并且无法使用 Intellisense。确定文件是否在该路径中的一种简便方法是:右击 #using 行,选择“打开文档”命令。如果找不到该文件,您将得到通知。
如果您不希望将完整路径放在文件中,可以使用 /AI 编译器选项来编辑 #using 引用的搜索路径。有关更多信息,请参见 /AI(指定元数据目录)。
使用 /FU 引用程序集
您也可以使用 /FU 编译器选项引用程序集,而不是直接从代码文件中引用程序集(如上所述)。此方法的优点是:不需要将 #using 语句分别添加到引用给定程序集的每个文件。
若要设置此选项,请打开项目的“属性页”。展开“配置属性”节点,然后展开“C/C++”节点并选择“高级”。在“强制 #using”旁边添加所需的程序集。有关更多信息,请参见 /FU(命名强制 #using 文件)。
使用“添加新引用”引用程序集
这是使用 CLR 程序集的最简便方法。首先,确保使用 /clr 编译器选项编译了项目。然后,在“解决方案资源管理器”中右击该项目并选择“引用”。将出现“属性页”对话框。
在“属性页”对话框中,选择“添加新引用”。将出现一个对话框,列出所有 .NET、COM 以及当前项目中可用的其他程序集。选择所需的程序集,单击“确定”。有关更多信息,请参见 “添加引用”对话框。
设置项目引用后,会立即自动处理相应的依赖项。此外,由于元数据是程序集的一部分,因此无需添加头文件或原型化将从托管程序集中使用的元素。
引用本机 DLL 或静态库
引用本机 DLL 或静态库
使用 #include 指令在代码中引用相应的头文件。头文件必须位于包含路径中或者是当前项目的一部分。有关更多信息,请参见 The #include Directive。
还可以设置项目依赖项。设置项目依赖项保证了以下两点。首先,它确保了按正确的顺序生成项目,以便项目始终可以找到它需要的依赖文件。其次,它隐式将依赖项目的输出目录添加到路径中,以便在链接时可轻松地找到文件。
若要部署应用程序,需要将 DLL 放在一个适当的位置中。该位置可以是下列值之一:
与可执行文件所在路径相同的路径。
系统路径(path 环境变量)中的任何位置。
位于并行程序集中。有关更多信息,请参见 生成 C/C++ 并行程序集。
使用多个项目
默认情况下,生成项目时,将在项目目录的一个子目录中创建所有的输出文件。该目录根据生成配置(例如,“调试”或“发布”)来命名。为了使同级项目能够互相引用,每个项目必须显式将其他项目输出目录添加到它们的路径中,以便成功进行链接。这是在设置项目依赖项时自动完成的。但是,如果不使用依赖项,您必须对此谨慎处理,因为生成可能变得非常难以管理。例如,如果一个项目具有“调试”和“发布”配置,并且它包括来自同级项目的外部库,则它应根据当前生成的配置来使用其他的库文件。因此,硬编码这些路径可能很棘手。
从 Visual C++ 2005 开始,所有重要的输出文件(如可执行文件、增量链接器文件和 PDB 文件)都被复制到公共的解决方案目录中。因此,当使用包含多个具有等效配置的 C++ 项目的解决方案时,所有的输出文件会集中在一起以简化链接和部署。如果将那些文件放在一起,则可确保它们的应用程序/库按预期工作(因为保证了这些文件位于路径中)。
在部署到生产环境时,输出文件的位置可能是一个主要问题。在 IDE 中运行项目时,包括的库的路径不一定与在生产环境中相同。例如,如果您在代码中使用 #using "../../lib/debug/mylib.dll",但是,然后将 mylib.dll 部署到不同的相对位置,则应用程序将在运行时失败。为了防止这种失败,应避免在代码中的 #include 语句中使用相对路径。最好确保必要的文件位于项目生成路径中,同样,确保正确地放置了相应的生产文件。
如何指定输出文件输出的位置
- 可在项目的“属性页”中设置项目的输出位置。展开“配置属性”旁边的节点,然后选择“常规”。输出位置是在“输出目录”旁边指定的。有关更多信息,请参见 “常规”属性页(项目)。