Quantcast
Channel: 程序人生 »代码疯子
Viewing all articles
Browse latest Browse all 59

error LNK2019 无法解析的外部符号

$
0
0

我是菜鸟我是菜鸟……最近遇到一个常识性错误,关于内联函数的(error LNK2019 无法解析的外部符号)。

通常编写函数时,会把声明放到头文件(*.h)中,而把函数定义放在源文件(*.cpp)中,在其他源文件中使用时包含对应的头文件即可。
但是内联函数(inline)不要定义在cpp文件中,因为我们通常都是包含头文件,而编译器在编译时会对内联函数进行展开操作,但是编译器只能在包含的头文件里搜索函数的定义体,如果头文件只有声明,显然编译器不知道该如何展开,于是就出错了。

每一个使用内联函数的地方,都应该知道内联函数的定义,所以内联函数就直接定义在头文件中。

一个错误的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Test.h
#ifndef _TEST_H
#define _TEST_H
 
class CTest
{
public:
    /*inline */void FooBar();
    //{
    //    printf("FooBar() called.\n");
    //}
};
 
#endif
 
// Test.cpp
#include "Test.h"
#include <stdio.h>
 
inline void CTest::FooBar()
{
    printf("FooBar() called.\n");
}
 
// Main.cpp
#include <stdio.h>
#include "Test.h"
 
int main(int argc, char **argv)
{
    CTest test;
    test.FooBar();
 
    return 0;
}

Visual Studio会抱怨:Main.obj : error LNK2019: 无法解析的外部符号 “public: void __thiscall CTest::FooBar(void)” (?FooBar@CTest@@QAEXXZ),该符号在函数 _main 中被引用

不过,既然内联函数在编译器就要展开,那为何在链接时才报错呢?这一点不是很明白,微软MSDN是这么说的:

同样,如果项目使用函数内联,但在 .cpp 文件(而非头文件)中定义函数,也会得到 LNK2019。
头文件包含在任何被认为合适的位置,但只有在 .cpp 文件通过编译器时函数才内联;
因此当函数用于其他模块时,链接器将函数看成无法解析的外部对象。

引用自:函数内联问题


本博客很少转载他人文章,如未特别标明,均为原创,转载请注明出处:
本文出自程序人生 >> error LNK2019 无法解析的外部符号
作者:代码疯子

没有相关文章推荐


Viewing all articles
Browse latest Browse all 59

Trending Articles