【问题标题】:Program gives LNK2019 error even after including header files即使包含头文件,程序也会出现 LNK2019 错误
【发布时间】:2011-03-27 04:11:33
【问题描述】:

我试图了解在 C++ 中包含多个文件的工作原理。我做了很多搜索,最后我写了一个测试代码来总结我的问题。我有两个头文件和两个 cpp 文件,如下所示:

test1.h:

#ifndef _TEST_1_H
#define _TEST_1_H

int val = 10;
void func1();

#endif

test2.h:

#ifndef _TEST_2_H
#define _TEST_2_H

#include "test1.h"
void func2();

#endif

test1.cpp:

#include <iostream>
#include "test1.h"

void func1()
{
    std::cout<<val<<std::endl;
}

test2.cpp:

#include <iostream>
#include "test2.h"

void func2()
{
    func1();
}

我的主文件如下所示:

test.cpp:

#include <iostream>
#include "test2.h"
#include "test1.h"


int main()
{
    func1();
    func2();
    getchar();
    return 0;
}

我使用的是 VS10,我只添加了“test.cpp”作为源文件。当我编译这段代码时,我得到以下错误:

**1>test.obj : error LNK2019: unresolved external symbol "void __cdecl func2(void)" (?func2@@YAXXZ) referenced in function _main **
**1>test.obj : error LNK2019: unresolved external symbol "void __cdecl func1(void)" (?func1@@YAXXZ) referenced in function _main **

即使包含两个头文件,我也不太明白为什么我会得到这个?我错过了什么?

任何帮助将不胜感激!

谢谢 新手

【问题讨论】:

    标签: c++ visual-c++


    【解决方案1】:

    包含文件只满足编译器。您需要将所有 obj 文件链接在一起。
    如果您使用的是 Visual Studio,请确保所有这些文件都包含在您正在构建的项目中。

    附带说明,在头文件上使用 int val = 10 是错误的 - 您将遇到链接问题。 将其放入 cpp 文件并在其标题上使用extern int val

    HTH

    【讨论】:

    • 感谢 Hertzel...包括 test1.cpp 和 test2.cpp 解决了这个问题。现在很明显,但我之前认为只包含头文件就可以解决这个问题。
    • 您对“val”的看法是正确的。但是,如果我这样做: static const int val = 10;如果我想声明一个全局 const 变量。有用。那么这是一个好习惯吗?
    • 这是有效的,但不一定是个好主意。这实际上取决于值的含义,但是您应该尝试将其包含在它所属的类中(如果可能的话)。对于常量全局变量,我更喜欢使用宏。使用一些包含文件,如“config.h”或其他并在那里设置这些东西。
    • 尽管马里奥似乎更喜欢宏,但我们中的许多人并不喜欢。他们引入了一系列全新的问题!如果需要的话,拥有一个全局配置常量就可以了。如果只在一个类中使用,则可以放在该类中。
    【解决方案2】:

    您必须告诉编译器编译所有 cpp 文件。编译器使用 cpp 文件构建目标文件,例如 test1.obj、test2.obj 和 test.obj。然后,它将这些对象链接到一个库或可执行文件中。

    你得到的是一个链接器错误,好的,test.obj 使用 func1 和 func2,我在 test1.h 和 test2.h 中有这些 func 的声明,但是它们在哪里实现?我没有 test1.obj 也没有 test2.obj,编译器似乎没有构建它们。

    【讨论】:

      【解决方案3】:

      包含头文件很少能解决链接错误。通常,标头会为您提供函数声明。然后,您需要链接为您提供函数定义的库。

      在这种情况下,您说您的项目中只有test.cpp。这意味着test1.cpptest2.cpp 既没有编译也没有链接,因此函数定义不存在。

      test1.cpptest2.cpp 添加到您的VS 项目中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-13
        • 1970-01-01
        • 2010-09-09
        • 2021-01-02
        • 1970-01-01
        相关资源
        最近更新 更多