热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

连接器工具错误lnk2019_2019年十大语文错误

连接器工具错误lnk2019_2019年十大语文错误已编译的函数的函数对符号进行引用或调用,但是链接器在要链接的任何库或对象文件中都找不到符号定义。此错误消息后跟严重错误LNK11

文章目录

  • 可能的原因
    • 1.不编译包含符号定义的源文件
    • 2.未链接包含符号定义的对象文件或库
    • 3.符号声明的拼写与符号的定义不同
    • 4.使用了函数,但是参数的类型或数量与函数定义不匹配
    • 5.已声明但未定义函数或变量
    • 6.函数声明和函数定义之间的调用约定不同
    • 7.符号在 C 文件中定义,但未 :::no-loc(extern)::: 在 c + + 文件中使用 “C” 进行声明
    • 7.符号定义为 :::no-loc(static)::: ,稍后在文件外部引用
    • 8. :::no-loc(static):::未定义类的成员
    • 9.生成依赖项仅在解决方案中定义为项目依赖项
    • 10.未定义入口点
    • 11.使用 Windows 应用程序的设置生成控制台应用程序
    • 12.尝试将64位库链接到32位代码,或将32位库链接到64代码
    • 13.将不同的编译器选项用于不同源文件中的函数内联
    • 14.在其作用域外使用自动变量
    • 15.调用内部函数或将参数类型传递到目标体系结构不支持的内部函数
    • 16.混合使用本机代码 :::no-loc(wchar_t)::: 和代码
  • 第三方库问题和 vcpkg
  • 诊断工具
  • 示例
    • 1.声明了符号,但是未对其进行定义
    • 2.:::no-loc(static):::已声明但未定义数据成员
    • 3.声明参数不匹配定义
    • 4.:::no-loc(wchar_t):::类型定义不一致
  • 其他资源

已编译的函数的函数对符号进行引用或调用,但是链接器在要链接的任何库或对象文件中都找不到符号定义。
此错误消息后跟严重错误LNK1120。 若要修复错误 LNK1120,必须先修复所有 LNK2001 和 LNK2019 错误。


可能的原因

有多种方法可获取此错误。 所有这些都涉及到链接器无法解析的函数或变量的引用,或查找的定义。 编译器可以确定符号未声明的时间,但无法判断符号未定义的时间。 这是因为定义可能位于不同的源文件或库中。 如果某个符号被引用但从未定义,则链接器将生成一个无法解析的 :::no-loc(extern)::: al 符号错误。

以下是一些导致 LNK2019 的常见问题:

1.不编译包含符号定义的源文件

在 Visual Studio 中,请确保定义符号的源文件编译为项目的一部分。 查看中间生成输出目录中是否有匹配的 .obj 文件。 如果未编译源文件,请在解决方案资源管理器中右键单击该文件,然后选择 “属性” 以检查该文件的属性。 “配置属性” ” > 常规” 页应显示C/c + + 编译器的项类型。 在命令行上,确保编译了包含定义的源文件。

2.未链接包含符号定义的对象文件或库

在 Visual Studio 中,请确保包含符号定义的对象文件或库链接为项目的一部分。 在命令行上,确保要链接的文件列表包含对象文件或库。

3.符号声明的拼写与符号的定义不同

验证在声明和定义中以及使用或调用该符号的任何位置都使用正确的拼写和大小写。

4.使用了函数,但是参数的类型或数量与函数定义不匹配

函数声明必须匹配定义。 请确保函数调用与声明匹配,并且声明与定义匹配。 调用模板函数的代码还必须拥有包括与定义相同的模板参数的匹配模板函数声明。 有关模板声明不匹配的示例,请参阅示例部分中的示例 LNK2019e。

5.已声明但未定义函数或变量

当标头文件中存在声明,但未实现匹配定义时,可能会出现 LNK2019。 对于成员函数或 :::no-loc(static)::: 数据成员,实现必须包括类范围选择器。 有关示例,请参见 Missing Function Body or Variable。

6.函数声明和函数定义之间的调用约定不同

调用约定( :::no-loc(__cdecl)::: 、 :::no-loc(__stdcall)::: 、 :::no-loc(__fastcall)::: 或 :::no-loc(__vectorcall)::: )作为修饰名称的一部分进行编码。 请确保调用约定是相同的。

7.符号在 C 文件中定义,但未 :::no-loc(extern)::: 在 c + + 文件中使用 “C” 进行声明

在编译为 c 的文件中定义的符号具有与 c + + 文件中声明的符号不同的修饰名称,除非使用 :::no-loc(extern)::: “C”修饰符。 请确保该声明匹配每个符号的编译链接。 同样,如果在 C 程序将使用的 C++ 文件中定义符号,请在定义中使用 :::no-loc(extern)::: “C” 。

7.符号定义为 :::no-loc(static)::: ,稍后在文件外部引用

在 c + + 中,与 C 不同, global :::no-loc(const)::: 蚂蚁有 :::no-loc(static)::: 链接。 若要绕过此限制,可以 :::no-loc(const)::: 在标头文件中包括初始化并将该标头包含在 .cpp 文件中,也可以将变量设置为非 :::no-loc(const)::: ant,并使用 :::no-loc(const)::: ant 引用来访问它。

8. :::no-loc(static):::未定义类的成员

:::no-loc(static):::类成员必须具有唯一的定义,否则它将违反单个定义规则。 :::no-loc(static):::无法以内联方式定义的类成员必须通过使用其完全限定名称在一个源文件中进行定义。 如果根本没有定义此方法,则链接器会生成 LNK2019。

9.生成依赖项仅在解决方案中定义为项目依赖项

在 Visual Studio 的早期版本中,此级别的依赖项已经足够。 但是,从 Visual Studio 2010 开始,Visual Studio 需要一个项目到项目的引用。 如果你的项目没有项目到项目的引用,则可能会收到此链接器错误。 添加项目到项目引用以修复此错误。

10.未定义入口点

应用程序代码必须 :::no-loc(main)::: :::no-loc(wmain)::: 为控制台应用程序和 :::no-loc(WinMain)::: 或 :::no-loc(wWinMain)::: Windows 应用程序定义适当的入口点。 有关详细信息,请参阅 :::no-loc(main)::: 函数和命令行参数或 :::no-loc(WinMain)::: 函数。 若要使用自定义入口点,请指定/ENTRY (入口点符号)链接器选项。

11.使用 Windows 应用程序的设置生成控制台应用程序

如果错误消息类似于函数function_name ** :::no-loc(extern)::: :::no-loc(WinMain)::: 中引用的无法解析的 al 符号**,则使用 /SUBSYSTEM:控制台(而不是 /SUBSYSTEM: WINDOWS)进行链接。 有关此设置的详细信息以及如何在 Visual Studio 中设置此属性的说明,请参阅 /SUBSYSTEM (Specify Subsystem)。

12.尝试将64位库链接到32位代码,或将32位库链接到64代码

链接到代码的库和对象文件必须编译为与代码相同的体系结构。 确保项目引用的库是针对与项目相同的体系结构编译的。 请确保 ” /LIBPATH ” 或 “其他库目录” 属性指向为正确的体系结构生成的库。

13.将不同的编译器选项用于不同源文件中的函数内联

使用 .cpp 文件中定义的内联函数并在不同源文件中混合使用函数内联编译器可能会导致 LNK2019。 有关详细信息,请参阅 Function Inlining Problems。

14.在其作用域外使用自动变量

自动(函数范围)变量仅可在该函数的范围内使用。 不能 :::no-loc(extern)::: 在其他源文件中声明和使用这些变量。 有关示例,请参见 Automatic (Function Scope) Variables。

15.调用内部函数或将参数类型传递到目标体系结构不支持的内部函数

例如,如果您使用 :::no-loc(AVX2)::: 内部函数,但未指定 / :::no-loc(ARCH)::: : :::no-loc(AVX2)::: 编译器选项,则编译器会假定该内部 :::no-loc(extern)::: 函数为 al 函数。 编译器不会生成内联指令,而是生成对 :::no-loc(extern)::: 与内部函数同名的 al 符号的调用。 当链接器尝试找到此缺失函数的定义时,它会生成 LNK2019。 请确保仅使用目标体系结构支持的内部函数和类型。

16.混合使用本机代码 :::no-loc(wchar_t)::: 和代码

默认情况下,在 Visual Studio 2005 中完成的 c + + 语言一致性工作 :::no-loc(wchar_t)::: 是本机类型。 如果并非所有文件都是使用相同的 **/zc: :::no-loc(wchar_t)::: **设置编译的,则类型引用可能不会解析为兼容的类型。 请确保 :::no-loc(wchar_t)::: 所有库和对象文件中的类型都是兼容的。 请从 typedef 中更新 :::no-loc(wchar_t)::: ,或在编译时使用一致的 **/zc: :::no-loc(wchar_t)::: **设置。

第三方库问题和 vcpkg

如果尝试在生成过程中配置第三方库时遇到此错误,请考虑使用vcpkg(c + + 程序包管理器)安装和生成库。 vcpkg 支持较大和不断增长的第三方库列表。 它将成功生成所需的所有配置属性和依赖项设置为项目的一部分。

诊断工具

有时很难判断链接器无法找到特定的符号定义的原因。 通常,问题是您在生成中未包含包含定义的代码。 或者,生成选项已为 al 符号创建了不同的修饰名称 :::no-loc(extern)::: 。 有多种工具和选项可以帮助你诊断 LNK2019 错误。


  • /:::no-loc(VERBOSE):::链接器选项可帮助你确定链接器引用了哪些文件。 此选项可帮助您验证您的生成中是否包括包含符号定义的文件。

  • /:::no-loc(EXPORTS):::实用工具的和 /:::no-loc(SYMBOLS)::: 选项 :::no-loc(DUMPBIN)::: 可帮助你发现 .dll 和对象或库文件中定义了哪些符号。 请确保导出的修饰名与链接器搜索的修饰名称匹配。

  • :::no-loc(UNDNAME)::: 实用工具可以显示修饰名称的等效未修饰 :::no-loc(extern)::: al 符号。


示例

以下是一些导致 LNK2019 错误的代码示例,以及关于如何修复错误的信息。

1.声明了符号,但是未对其进行定义

在此示例中, :::no-loc(extern)::: 声明了 al 变量但未对其进行定义:

// LNK2019.cpp
// Compile by using: cl /EHsc /W4 LNK2019.cpp
// LNK2019 expected
:::no-loc(extern)::: char B[100]; // B isn't available to the linker
int :::no-loc(main):::() {

B[0] = ' '; // LNK2019
}

下面是另一个示例,其中变量和函数声明为 :::no-loc(extern)::: 但未提供定义:

// LNK2019c.cpp
// Compile by using: cl /EHsc LNK2019c.cpp
// LNK2019 expected
:::no-loc(extern)::: int i;
:::no-loc(extern)::: void g();
void f() {

i++;
g();
}
int :::no-loc(main):::() {
}

除非 i 和 g 是在生成中包含的其中一个文件中定义的,否则链接器会生成 LNK2019。 你可以通过将包含定义的源代码文件作为编译的一部分包括在其中来修复错误。 或者,可以将包含定义的 .obj 文件或 .lib 文件传递到链接器。

2.:::no-loc(static):::已声明但未定义数据成员

当 :::no-loc(static)::: 声明但未定义数据成员时,也可能出现 LNK2019。 以下示例生成 LNK2019,并演示如何修复此错误。

// LNK2019b.cpp
// Compile by using: cl /EHsc LNK2019b.cpp
// LNK2019 expected
struct C {

:::no-loc(static)::: int s;
};
// Uncomment the following line to fix the error.
// int C::s;
int :::no-loc(main):::() {

C c;
C::s = 1;
}

3.声明参数不匹配定义

调用模板函数的代码必须拥有匹配的模板函数声明。 声明必须包括与定义相同的模板参数。 以下示例在用户定义的运算符上生成 LNK2019,并演示如何修复此错误。

// LNK2019e.cpp
// compile by using: cl /EHsc LNK2019e.cpp
// LNK2019 expected
#include
using namespace std;
template<class T> class
Test {

// The operator<
friend ostream& operator<<(ostream&, Test&);
// To fix, replace the line above with the following:
// template friend ostream& operator<<(ostream&, Test&);
};
template<typename T>
ostream& operator<<(ostream& os, Test<T>& tt) {

return os;
}
int :::no-loc(main):::() {

Test<int> t;
cout << "Test: " << t << endl; // LNK2019 unresolved :::no-loc(extern):::al
}

4.:::no-loc(wchar_t):::类型定义不一致

此示例创建一个 DLL,该 DLL 包含一个使用的导出 WCHAR ,该导出将解析为 :::no-loc(wchar_t)::: 。

// LNK2019g.cpp
// compile with: cl /EHsc /LD LNK2019g.cpp
#include "windows.h"
// WCHAR resolves to :::no-loc(wchar_t):::
__declspec(dllexport) void func(WCHAR*) {
}

下一个示例使用上一示例中的 DLL,并生成 LNK2019,因为类型 unsigned short* 和 WCHAR* 不同。

// LNK2019h.cpp
// compile by using: cl /EHsc LNK2019h LNK2019g.lib
// LNK2019 expected
__declspec(dllimport) void func(unsigned short*);
int :::no-loc(main):::() {

func(0);
}

若要修复此错误,请将更改 unsigned short 为 :::no-loc(wchar_t)::: 或 WCHAR ,或使用/zc 编译 LNK2019g **: :::no-loc(wchar_t)::: &#8211; **。

其他资源

有关 LNK2001 的可能原因和解决方案的详细信息,请参阅 Stack Overflow 问题:未定义的引用/未解析的 &#8221; :::no-loc(extern)::: 符号错误&#8221;,以及如何修复该错误?。


推荐阅读
  • 全局变量与常量在内存中的布局分析及应用
    本文详细探讨了全局变量与常量在内存中的存储布局及其应用。通过分析不同编译器和操作系统对全局变量与常量的处理方式,揭示了它们在内存中的具体分配机制。此外,文章还讨论了这些布局对程序性能和安全的影响,并提供了优化建议,帮助开发者更好地理解和利用全局变量与常量的内存管理。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 当使用 `new` 表达式(即通过 `new` 动态创建对象)时,会发生两件事:首先,内存被分配用于存储新对象;其次,该对象的构造函数被调用以初始化对象。为了确保资源管理的一致性和避免内存泄漏,建议在使用 `new` 和 `delete` 时保持形式一致。例如,如果使用 `new[]` 分配数组,则应使用 `delete[]` 来释放内存;同样,如果使用 `new` 分配单个对象,则应使用 `delete` 来释放内存。这种一致性有助于防止常见的编程错误,提高代码的健壮性和可维护性。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 本文深入探讨了佩尔方程 \( x^2 - dy^2 = 1 \) 的递推关系式。通过构造特定的矩阵并利用矩阵快速幂的方法,可以高效地计算出该方程的第 k 组解。此外,文章还详细分析了递推关系式的数学背景及其在数论中的应用,为相关研究提供了坚实的理论基础。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • Codeforces 605C:Freelancer's Dreams —— 凸包算法解析与题解分析 ... [详细]
author-avatar
@Cobub
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有