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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

已编译的函数的函数对符号进行引用或调用,但是链接器在要链接的任何库或对象文件中都找不到符号定义。
此错误消息后跟严重错误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 <iostream>
using namespace std;

template<class T> class
Test { 
   
   // The operator<< declaration doesn't match the definition below:
   friend ostream& operator<<(ostream&, Test&);
   // To fix, replace the line above with the following:
   // template<typename T> friend ostream& operator<<(ostream&, Test<T>&);
};

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)::: – **。

其他资源

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188584.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java空指针报错_空指针异常是什么意思

    java空指针报错_空指针异常是什么意思Java中任何对象都有可能为空,当我们调用空对象的方法时就会抛出NullPointerException空指针异常,这是一种非常常见的错误类型。我们可以使用若干种方法来避免产生这类异常,使得我们的代码更为健壮。本文将列举这些解决方案,包括传统的空值检测、编程规范、以及使用现代Java语言引入的各类工具来作为辅助。运行时检测最显而易见的方法就是使用if(obj==null)来…

    2025年7月20日
    3
  • 线性代数投影矩阵的定义_线性代数a和线性代数b

    线性代数投影矩阵的定义_线性代数a和线性代数bAbout投影矩阵  一个矩阵AAA既可以表示一种线性变换,又可以是一个子空间(由基张开的),还可以是一组坐标,甚是神奇。文章目录About投影矩阵一维空间的投影矩阵投影矩阵的多维推广投影的物理意义信号处理中的正交投影技术一维空间的投影矩阵  查看上图,ppp是bbb在aaa上的投影,可以发现,ppp和aaa是同向的,故可以表示为如下形式,其中xxx是标量p=axp=axp=ax  根据eee和ppp正交的条件,可以推导出x=aTbaTax=\frac{a^Tb}{a^Ta}x=aTaaT

    2022年10月4日
    2
  • Spring Boot配置log4j记录日志

    Spring Boot配置log4j记录日志转载请注明出处 SpringBoot 配置 log4j 记录日志我们在老的项目框架 ssh springMVC 中都使用过 log4j 日志模块 例如 java 日志功能 log4j 模块的使用方法 SpringBoot 框架也能很好的快速集成 log4j 本篇文章记录如何在 SpringBoot 框架中使用 log4j 引入 log4j 依赖在创建 SpringBoot 工程时 我们引入了 spring boot st

    2026年1月22日
    1
  • 10.10.10.1可以设置为网关吗_个人如何做跨境电商

    10.10.10.1可以设置为网关吗_个人如何做跨境电商【大型电商项目开发】商品服务-配置网关路由与路径重写-10

    2022年7月28日
    6
  • Assert.assertEquals()方法参数详解

    Assert.assertEquals()方法参数详解junit.framework包下的Assert提供了多个断言方法.主用于比较测试传递进去的两个参数.Assert.assertEquals();及其重载方法:1.如果两者一致,程序继续往下运行.2.如果两者不一致,中断测试方法,抛出异常信息AssertionFailedError.查看源码,以Assert.assertEquals(intexpected,inta…

    2022年7月13日
    16
  • Java访问权限之 protected详解「建议收藏」

    Java访问权限之 protected详解「建议收藏」对于类的成员(包括成员变量和成员方法)而言,其能否被其他类所访问,取决于该成员的修饰词;而对于一个类而言,其能否被其他类所访问,也取决于该类的修饰词。在Java中,类成员访问权限修饰词有四类:private,无(包访问权限),protected和public,而其中只有包访问权限和public才能修饰一个类(内部类除外)。由于很多Java书籍对protected可见性的介绍都比较笼统,本文重点说明了protected关键字的可见性内涵。

    2025年7月3日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号