C++ 包含来自其他目录的标题时出现Visual Studio链接错误

C++ 包含来自其他目录的标题时出现Visual Studio链接错误,c++,visual-studio,linker,C++,Visual Studio,Linker,简短的问题是:如何使用Visual Studio创建/编译/运行源代码位于不同目录中的项目。 具体情况如下: 我在一个目录中有一个类定义文件(.hpp)和实现文件(.cpp),在另一个目录中有一个main.cpp文件。在VisualStudio2008中,我创建了一个新项目,并将main.cpp放在该项目中。我将类文件目录添加到其他包含目录中(右键单击项目->项目属性->配置属性-C/C++-General->其他包含目录=C:\Test\cpp) 当我这样做时,intellisense在编辑m

简短的问题是:如何使用Visual Studio创建/编译/运行源代码位于不同目录中的项目。

具体情况如下:

我在一个目录中有一个类定义文件(.hpp)和实现文件(.cpp),在另一个目录中有一个main.cpp文件。在VisualStudio2008中,我创建了一个新项目,并将main.cpp放在该项目中。我将类文件目录添加到其他包含目录中(右键单击项目->项目属性->配置属性-C/C++-General->其他包含目录=C:\Test\cpp)

当我这样做时,intellisense在编辑main.cpp时工作正常。当我构建项目时,它可以很好地编译,但我会遇到链接错误,例如:

错误LNK2019:未解析的外部符号“public:int u thiscall Test::add(int)”(?add@Test@@QAEHH@Z)在函数_main中引用

据我所知,VisualStudio实际上并没有编译Test.cpp(我没有看到任何为它制作的.obj文件)。在编译/构建main.cpp之前,我尝试过将其分开编译,但没有任何区别。有办法解决这个问题吗?当我在网上搜索答案时,我看到很多人忘记为链接器包含库,但我没有处理任何库

我还通过将Test.hpp和Test.cpp移动到main.cpp所在的同一目录,验证了这段代码的编译和运行是否正确,这段代码运行起来没有任何问题。我会坚持这种设置,但我需要能够为我正在进行的项目使用来自不同目录的源代码

以下是3个文件:

  • C:\Test\cpp\Test.hpp

    #ifndef TEST_H
    #define TEST_H
    
    class Test
    {
    private:
      int mynum;
    
    public:
      Test();
      int add(int num);
    
    };
    #endif //TEST_H
    
  • C:\Test\cpp\Test.cpp

    #include "Test.hpp"
    
    Test::Test()
    {
      mynum = 0;
    }
    
    int Test::add(int num)
    {
      return mynum += num;
    }
    
  • C:\Visual Studio项目\MyProject\main.cpp

    #include <iostream>
    #include <Test\Test\Test.hpp>
    
    int main(int argc, char *argv[])
    {
      Test test;
      std::cout << "Add 5 = " << test.add(5) << std::endl;
      return 0;
    }
    
    #包括
    #包括
    int main(int argc,char*argv[])
    {
    试验;
    
    std::cout将
    Test.h
    Test.cpp
    添加到项目中(您应该能够从资源管理器中拖动文件)


    您还需要指定额外的include目录,但听起来您已经对其进行了排序。

    底线是您必须编译Test.cpp并以某种方式与之链接。两个选项:

  • 将Test.cpp添加到项目中
  • 创建一个库项目,比如TestLib。将Test.cpp添加到该项目并编译它。然后将主项目链接到TestLib

  • 在第二种情况下,您可以在VisualStudio中拥有相关的项目。这样,当您构建主项目时,它将正确地提取适当的调试/发布/等版本的库。它还将从正确的文件夹中获取库。例如,无需手动修改链接器设置。

    如我所述-我可以将Test.hpp和Test.cpp添加到项目中一段时间事情这么简单,但我还有其他不那么简单的项目需要单独的目录。例如,我将在本地计算机上创建项目,使用存储在服务器/中央源代码管理存储库中的代码。您还声明“我不处理任何库”。如果您想在多个项目中重复使用代码s、 按照dpiskyulev的建议,将公共代码编译为.dll或库是一种可行的方法。如果您的意思是“我会坚持使用该设置,但我需要能够为我正在处理的项目使用来自不同目录的源代码”,那么没有什么可以阻止您将多个目录导入到单个项目中<在项目设置中输入目录时,在目录之间进行编码>;