【问题标题】:visual c++: #include files from other projects in the same solutionvisual c++:#include 来自同一解决方案中其他项目的文件
【发布时间】:2010-10-10 17:14:35
【问题描述】:

我正在使用 Visual C++ 开发游戏。我在单独的项目中有一些组件,并设置了项目依赖项。如何#include 来自不同项目的头文件?我不知道如何在另一个项目中使用一个项目中的类。

【问题讨论】:

    标签: c++ visual-studio projects-and-solutions


    【解决方案1】:

    编译器设置

    在您想#include another 项目的头文件的项目中,您需要将头文件的路径添加到 Additional Include Directories 部分在项目配置中。

    访问项目配置:

    1. 右键单击项目,然后选择属性。
    2. 选择配置属性->C/C++->常规。
    3. 在 Additional Include Directories 下设置路径。

    如何包含

    包含头文件,只需在代码中编写以下内容:

    #include "filename.h"
    

    注意这里不需要指定路径,因为你已经在 Additional Include Directories 中包含了该目录,所以 Visual Studio 会知道在哪里查找它。

    如果你不想在项目设置中添加每个头文件位置,你可以只包含一个目录,然后 #include 相对于该点:

    // In project settings
    Additional Include Directories    ..\..\libroot
    
    // In code
    #include "lib1/lib1.h"    // path is relative to libroot
    #include "lib2/lib2.h"    // path is relative to libroot
    

    链接器设置

    如果使用静态库(即 .lib 文件),您还需要将库添加到链接器输入,以便在链接时可以链接符号(否则您将获得未解析的符号):

    1. 右键单击项目,然后选择属性。
    2. 选择配置属性->链接器->输入
    3. 在 Additional Dependencies 下输入库。

    【讨论】:

    • 我只想说,在阅读了一上午关于 SO 的这个主题的答案之后,你的答案是我所遇到的最清晰和最全面的。做得好,谢谢!
    • 匿名用户有一个建议,“当您包含库的路径时,如果路径有空格,请确保在引号中输入它们”。如果对任何人有帮助,请将其添加为评论。
    • 另一种包含静态库的方法是,在解决方案的“项目依赖项”中,将项目配置为要链接到的静态库的依赖项。我花了很长时间才弄清楚为什么我的一个项目链接正确而另一个链接不正确 - 这就是原因。
    • 我想指出,将“附加包含目录”与其他项目的源文件目录一起使用可能是一个糟糕的主意。另一个项目可能有同名的文件(如果您为每个项目使用预编译的头文件,则很可能)。就个人而言,我更喜欢添加项目源文件的父文件夹,因此您至少可以指定自己,例如#include "proj2\include.h"。每个解决方案拥有多个项目似乎非常针对 NET 语言,因为它们的使用方式非常不同。然而,要找到一个很好的方法来克服 C++ 项目的这个问题。
    • 这个有点粗制滥造。 VS 可以自动完成很多工作。与硬编码路径相比,很难相信没有更好的解决方案 - 项目依赖设置等可能很好。
    【解决方案2】:

    由于两个项目都在同一个解决方案下,因此包含文件和链接器有一种更简单的方法,如https://docs.microsoft.com/en-us/cpp/build/adding-references-in-visual-cpp-projects?view=vs-2019 中所述:

    1. 包含可以写在相对路径中(例如#include "../libProject/libHeader.h")。
    2. 对于链接器,右键单击“References”,单击 Add Reference,然后选择其他项目。

    【讨论】:

    • 简单又好用,但是在包含标题的任何地方都需要相对路径,这太糟糕了。
    • IMO 这是最好的答案。如果将“../libProject”添加到包含路径,则相对路径会更简单:(VS2015)属性/“C/C++”/附加包含路径
    • 毫无疑问,这应该是公认的答案。
    【解决方案3】:

    #include 与项目无关——它只是告诉预处理器“把头文件的内容放在这里”。如果你给它一个指向正确位置的路径(可以是相对路径,比如 ../your_file.h),它将被正确包含。

    但是,您必须了解库(静态/动态库)才能使此类项目正确链接 - 但这是另一个问题。

    【讨论】:

      【解决方案4】:

      扩展@Benav 的答案,我首选的方法是:

      1. 将解决方案目录添加到包含路径:
        • 在解决方案资源管理器中右键单击您的项目
        • 选择属性
        • 从下拉列表中选择所有配置和所有平台
        • 选择 C/C++ > 常规
        • $(SolutionDir) 添加到其他包含目录
      2. 为您要使用的每个项目添加引用:
        • 在解决方案资源管理器中右键单击项目的引用
        • 选择添加参考...
        • 选择您要参考的项目

      现在您可以像这样包含引用项目中的标头:

      #include "OtherProject/Header.h"
      

      注意事项:

      • 这假定您的解决方案文件存储在每个项目的上一个文件夹中,这是使用 Visual Studio 创建项目时的默认组织。
      • 您现在可以从相对于解决方案文件夹的路径中包含 任何 文件,这可能是不可取的,但为了方法的简单性,我可以接受。
      • #includes 不需要第 2 步,但它设置了您可能想要的正确构建依赖项。

      【讨论】:

      • 这也是中大型代码库的最佳答案,因为最终您会遇到标题名称冲突或没有明显来源的标题:#include "Retry.h" 这也是 Google 的做法。我花了一段时间才恢复到这种思维方式,但现在我已经使用了几年,很难再回头了。例如,请查看名称和包含顺序下的 Google C++ 样式指南。
      【解决方案5】:

      您需要在项目属性中设置头文件的路径,以便编译器在尝试查找头文件时查找头文件。我不记得确切的位置,但是查看项目属性,您应该会看到它。

      【讨论】:

      • 位置可以在 Properties>C/C++>General>Additional Include Directories 下。
      【解决方案6】:

      尽量避免 #include 指令中的完整路径引用,无论它们是绝对的还是相对的。相反,在您的项目设置中添加其他项目的包含文件夹的位置。必要时仅使用路径引用中的子文件夹。这样一来,无需更新代码就可以更轻松地移动内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多