首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++编译器错误:找不到从_main引用的成员函数的ld:符号

C++编译器错误:找不到从_main引用的成员函数的ld:符号

这个错误是由于在C++程序中,编译器无法找到_main函数所引用的成员函数的定义,导致链接器(ld)报错。

解决这个问题的方法是确保_main函数所引用的成员函数在程序中有正确的定义和实现。以下是一些可能导致这个错误的常见原因和解决方法:

  1. 成员函数未定义:检查程序中所有被_main函数引用的成员函数,确保它们都有正确的定义和实现。如果成员函数定义在其他文件中,确保在编译时将其包含在编译命令中。
  2. 成员函数命名错误:检查成员函数的命名是否正确,包括大小写、拼写和参数列表。确保_main函数引用的成员函数与其定义完全匹配。
  3. 成员函数定义顺序错误:如果成员函数的定义顺序不正确,可能会导致链接错误。确保在使用成员函数之前,先定义它们。
  4. 成员函数定义在错误的作用域中:如果成员函数定义在错误的类或命名空间中,编译器将无法找到它们。确保成员函数定义在正确的类或命名空间中。
  5. 编译器选项错误:检查编译器选项是否正确设置。确保使用正确的编译器选项来编译和链接程序。

总结:

C++编译器错误:找不到从_main引用的成员函数的ld:符号是由于_main函数引用的成员函数在程序中没有正确的定义和实现所导致的。解决方法包括确保成员函数定义正确、命名正确、顺序正确、作用域正确,并检查编译器选项是否正确设置。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

LNK2019 无法解析的外部符号 WinMain,该符号在函数 int __cdecl invoke_main(void) (?invoke_main@@YAHXZ) 中被引用

这个报错网上查了很多,大概原因是: c语言运行时找不到适当的程序入口函数, 一般情况下,如果是windows程序,那么WinMain是入口函数,在VS中新建项目为“win32项目” 如果是dos控制台程序...,那么main是入口函数,在VS中新建项目为“win32控制台应用程序” 而如果入口函数指定不当,很显然c语言运行时找不到配合函数,它就会报告错误。...(主函数); 反之也一样,创建项目时,选择了win32项目,而把代码当win32控制程序写了,即代码里面使用main()做为函数入口(主函数); 所以出现了以上报错,意思就是主函数和当前项目不匹配。...(6)Win32控制台程序:初始代码模版以main为程序入口,默认情况下,只链接C++运行时库和一些核心的win32库,链接器subsystem参数为console类型,所以编译出来的程序会有黑色的控制台窗口作为呈现标准输入.../subsystem:windows或/subsystem:console删除,由编译器自己决定也可以

17.2K51

QT使用windowsAPI函数提示error LNK2019: 无法解析的外部符号 该符号在函数 _main 中被引用解决方案

在使用windowsAPI函数的过程中,已经加入了头文件,但是依旧会报error LNK2019: 无法解析的外部符号该符号在函数 _main 中被引用,我以前也用过...API,但是没有出现此问题,最后的解决方案是只需要在pro文件下面加入win32:LIBS += -luser32即可解决问题。...查了半天资料,在qt中调用Windows API函数有时需要自己关联系统库时,不仅仅需要相关的头文件,有些还需要自己关联系统库,就想SystemParametersInfoA()这个函数这样;但是有些系统函数在...打开MSDN,右上角输入这个函数,拉到最下面。 参考博文:Qt调用头文件setupapi.h的函数SetupDiGetClassDevs()编译出错

3.9K20
  • 返回类型引用(ref-qualified)的C++成员函数暗示了什么?

    一、引子:返回引用类型的成员函数是 暗示了使用它的this指针是左值还是右值。反过来说,如果一个成员函数不返回引用类型,那么对this指针是左值还是右值都是调用同一个函数。...----二、解释:先说结论,来说一个c++的一个理解。如果成员函数是有一致性(consistency)的,那么non-const, non-static的函数 总是要被&( &-qualified)。...3.1、只对右值形参操作一种场景是上面这个例子,防止用户错误地将一个暂存值传入给函数,然后期盼这个函数做出修改。(换句话说,只允许成员函数操作右值形参。...这个情况这个函数应该被修饰为 &&-qualified)。比如说这个函数会从对象object取到资源resources,然后处于未指定的状态。...有时候一个成员函数需要有能力从类中取到资源,那么他就能被右值rvalue call到,否则,它就是const修饰的成员函数。

    21220

    认识目标文件的符号

    特殊符号 当我们使用 ld 作为链接器来链接生产可执行文件时,它会为我们定义很多特殊的符号,这些符号并没有在你的程序中定义,但是你可以直接声明并且引用它,我们称之为特殊符号。...下面以 C++ 为例,看一下现代高级编程语言对符号的修饰方法。 C++ 支持函数重载,两个相同名字的函数 func(int) 和 func(double) 编译时并不会报重定义错误。...的时候,并且用到了 memset 函数,编译器能够正确引用。...但是在C++语言中,编译器会认为这个 memset 函数是一个 C++ 函数,将 memset 的符号修饰成 _Z6memsetPvii,这样链接器就无法与 C 语言库中的 memset 符号进行链接。...但是当我们运行这个可执行文件时,会发生运行错误。因为当main函数试图调用foo函数时,foo函数的地址为0,于是发生了非法地址访问的错误。

    1.6K40

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

    :::no-loc(wchar_t):::类型定义不一致 其他资源 已编译的函数的函数对符号进行引用或调用,但是链接器在要链接的任何库或对象文件中都找不到符号定义。...所有这些都涉及到链接器无法解析的函数或变量的引用,或查找的定义。 编译器可以确定符号未声明的时间,但无法判断符号未定义的时间。 这是因为定义可能位于不同的源文件或库中。...如果某个符号被引用但从未定义,则链接器将生成一个无法解析的 :::no-loc(extern)::: al 符号错误。...请确保该声明匹配每个符号的编译链接。 同样,如果在 C 程序将使用的 C++ 文件中定义符号,请在定义中使用 :::no-loc(extern)::: “C” 。...但是,从 Visual Studio 2010 开始,Visual Studio 需要一个项目到项目的引用。 如果你的项目没有项目到项目的引用,则可能会收到此链接器错误。

    4.1K20

    C++入门----类和对象以及几个关键字的使用

    内联函数 概念:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。...inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址 了,链接就会找不到。...#include "F.h" int main() { f(10); return 0; } // 链接错误:main.obj : error LNK2019: 无法解析的外部符号 "void...f@@YAXH@Z),该符号在函数 _main 中被引用 auto关键字(C++11) auto带来的便利 从字面意思来考察auto就是自动的意思,不难看出auto就是我们可以先给定后面变量的类型,然后...类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。

    5710

    C++从入门到精通——类的6个默认成员函数之构造函数

    前言 类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。...默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 class Date {}; 一、构造函数的概念 C++构造函数是一种特殊的成员函数,用于创建和初始化类的对象。...在C++中,构造函数在对象创建时自动调用,而析构函数则在对象被销毁时自动调用,它们共同组成了C++中的构造函数和析构函数机制,用于管理对象的生命周期。...Date d3(); } 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。...,自定义类型就是我们使用class/struct/union等自己定义的类型,看看下面的程序,就会发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数。

    17410

    【编程基础】extern C的用法解析

    这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。   ...作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。...例如,假设某个函数的原型为: void foo( int x, int y );   该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同...同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以"."来区分。...,连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!

    1K30

    头文件是必须的吗?跟一跟编译过程~~~

    C/C++中头文件是必须的吗? 不是。...声明变量可以告诉编译器这个变量类型是什么,占多少个字节。声明函数则可以告诉编译器函数名是什么、返回类型是什么、参数个数、参数类型是什么。不声明就使用,别人怎么知道func是什么东西呢?...上面的ld是链接器,是一个可执行程序,它的输入是一个或多个目标文件,如上面指令中的main.o。 也就是说,目标文件main.o中引用了func(),但链接器找不到它的定义。...即,链接器在面对一个目标文件时,如果碰到里面有未定义的引用,会在其他目标文件中查找,如果找不到,则报错“undefined reference to”。如果找到有且仅有一个,则pass。...本文只是就着这个问题,跟了下编译的过程,看看平常开发过程中遇到的编译报错“未定义的引用”、“未声明的变量”这些错误来源是哪原因是什么。

    2.2K10

    【C++】undefined reference to 问题常见的解决方法

    collect2: ld returned 1 exit status 这就是最典型的undefined reference错误,因为在链接时发现找不到某个函数的实现文件,本例中test.o...reference to `test' collect2: ld returned 1 exit status 其根本原因也是找不到test()函数的实现文件,由于该test()函数的实现在...func()函数,找不到对应的实现。...同样,如果我们的库或者程序中引用了第三方库(如pthread.a)则同样在链接的时候需要给出第三方库的路径和库文件,否则就会得到undefined reference的错误。...1 exit status 原因就是main.cpp为c++代码,调用了c语言库的函数,因此链接的时候找不到,解决方法:即在main.cpp中,把与c语言库test.a相关的头文件包含添加一个

    3.8K21

    【C++ 函数重载】—— 现代编译技术下的多态表达与性能优化

    关键操作: 链接器通过修饰后的名称解析外部符号引用。 若找不到匹配的符号(如名称修饰不一致),引发链接错误。...在函数重载的场景下,符号表会存储每个重载函数的名称、参数类型、返回值类型、函数地址等信息。编译器在编译过程中通过符号表来查找和管理函数,在函数匹配时,会从符号表中获取候选函数的信息进行匹配。...符号解析:链接器会解析每个符号引用,查找对应的符号定义。如果找不到符号定义,链接器会报错。...地址重定位:链接器会为每个符号分配最终的内存地址,并对代码中的符号引用进行重定位,确保程序能够正确地调用相应的函数和访问变量。...编译和链接:编译阶段,编译器根据名称修饰和函数匹配规则处理函数调用并生成机器代码,同时在目标文件记录函数符号信息;链接阶段,链接器根据修饰后的函数名关联函数调用和定义,若找不到函数定义则报错。

    14210

    C++从入门到精通——类的6个默认成员函数之拷贝构造函数

    并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。...定义 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。...C++拷贝构造函数是一种特殊的构造函数,用于创建对象时,使用一个已有对象的内容来初始化新的对象。它接受一个同类对象作为参数,并按照该对象的数据成员的值来创建新的对象。...拷贝构造函数通常用于以下情况: 在创建对象时,使用同类已有对象的值来初始化新对象。 以值传递方式将对象传递给函数。 以值返回方式从函数返回对象。...拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。

    33010

    C++从入门到精通——类的6个默认成员函数之析构函数

    并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。...在C++中,析构函数是一种特殊的成员函数,用于在对象被销毁时清理其使用的资源。它的名称与类的名称相同,前面加上一个波浪线(~),没有返回类型,也不接受任何参数。...下面的程序我们会看到,编译器生成的默认析构函数,对自定类型成员调用它的析构函数。跟构造函数类似,内置类型不做处理,自定义类型调用它的析构函数。...但是:main函数 中不能直接调用Time类的析构函数,实际要释放的是Date类对象,所以编译器会调用Date类的析构函数,而Date没有显式提供,则编译器会给Date类生成一个默认的析构函数,目的是在其内部调用...Time 类的析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁 main函数中并没有直接调用Time类析构函数,而是显式调用编译器为Date类生成的默认析构函数 注意:创建哪个类的对象则调用该类的析构函数

    41021

    C++打怪升级(一)- 命名空间、缺省形参、重载

    编译器查找标识符规则: 默认情况:先在标识符所在作用域向上查找,找不到再去全局作用域向上查找,都找不到就报错; 指定(特定)查找:需要使用域作用限定符::,直接去指定的作用域去查找标识符,找不到直接报错...正确举例: 错误举例: 函数调用时传实参规则: 实参可以从左向右连续传入;不从左向右或·有跳跃则出错。...这里就是C语言不支持重载的原因: 在同一个源文件中定义的相同的函数名后,到形成符号表这里会出现两个相同的函数名,并且这两个函数还都是有效的,是编译错误。...在接下来的链接阶段,会进行不同符号表的不同符号的合并,此时还是会遇到两个完全相同的函数名并且都是有有效地址,导致链接错误。...C++形成汇编阶段也会形成符号表,对于函数来说,不是简单的直接把函数名放入符号表,而是对函数名进行事先确定好的规则进行修饰,成为一个独一份的名字以此确保不会与其他有函数定义的函数名重复。

    88620

    深入浅出GCC编译器

    上面可以看到,nm列出的信息总共有三列:第一列是指程序运行时的符号所对应的地址,对于函数来说表示的是函数的开始地址,对于变量则表示的是变量的存储地址;第二列是指相应符号是放在内存的哪一个段;第三列则是指符号的名称...(4)链接(Linking) 由链接器完成,主要解决多个文件之间符号引用的问题,即symbol resolution。...编译时编译器只对单个文件进行处理,如果该文件里面需要引用到其他文件中的符号,比如全局变量或者调用了某个库函数中的函数,那么这时候,在这个文件中该符号的地址是没法确定的,只能由链接器把所有的目标文件链接到一起才能确定最终的地址...(3)-I 指定包含头文件路径及头文件引入的两种方法 我们编译一下前面准备好的main.c和test.c 可以看到,编译错误,找不到头文件test.h,这时有人可能会很奇怪,在main.c中和test.c...也就是说,出现这个错误的原因是,gcc编译器找不到test.h这个文件,它不知道这个文件在哪个目录下。

    53210

    C++ 编译器和链接器的完全指南

    C++是一种强类型语言,它的编译和链接是程序开发过程中不可或缺的两个环节。编译器和链接器是两个非常重要的概念。本文将详细介绍C++中的编译器和链接器以及它们的工作原理和使用方法。...链接器 链接器是将多个目标文件合并成一个可执行文件的程序。在C++中,常用的链接器有GCC和ld。链接器的主要工作是将程序中引用的函数和变量与定义的函数和变量进行匹配,最终生成可执行文件。...在程序开发中,我们常常需要调用其他人编写的库函数。这时候,链接器会将程序中引用的函数与库函数进行匹配,从而生成可执行文件。如果链接器无法找到所需的库函数,编译过程就会失败。...编译器将汇编代码转换为机器码,并生成目标文件。 链接器将多个目标文件合并成一个可执行文件,并解决符号引用问题。 在这个过程中,编译器和链接器都需要使用选项来控制其行为。...这些选项可以控制编译器和链接器的优化等级、调试信息、符号表和库文件搜索路径等等。 总结 编译器和链接器是C++编程中不可或缺的工具。

    87320

    C++基础知识复习

    1.本质——C++编译器到底在背后做了什么? int &b = a ;——》 int* const b = &a; 2.引用有没有自己的空间? 引用是有自己的空间的。...3.同一内存空间可以取多个别名 (当我们使用一些引用语法的时候,无需关心编译器背后是如何作用的,但当我们分析奇怪语法现象的时候,我们才会关系C++编译器是怎么去做的) pointer reference...---- 子类中有父类中相同的成员函数,优先调用子类自己的,找不到再去父类里面找,还找不到,那就失败。 ---- 成员函数,不占用对象的内存空间,但是也被子类继承了。...否则可能和C++的其他规则矛盾,只能使用成员函数形式进行重载。...最好在编写代码的时候让编译器来帮我们找出错误,这样能减少很多麻烦。 相比与C风格的字符串,string风格的字符串更加优雅。

    56310

    iOS编译原理

    语言 扩展了C语言的能力,使其具备面向对象设计的能力,相当于C的超集; OC代码中也可以有C和C++语句,它可以调用C函数,也可以通过C++对象访问方法; 4.OC与C++的比较 OC与C++都是从...在编译阶段降低了编译要求提高了灵活性,而C++则是提高了编译要求,在编译过程中就发现更多的潜在错误,在运行前改正,降低了灵活性; 以下面的代码为例,在编译期间,C++认为是错误的,而OC则认为没有问题:...; 比如Loc=main.m:4:1> 就表示:'int'这个符号是从源文件main.m的第4行的第1个字符开始的; 2.语法分析(Semantic Analysis) 主要功能:对源代码符号进行分析...NSLog函数,对应着_NSLog符号: undefined:表示在当前文件暂时找不到符号_NSLog; external:表示这个符号是外部可以访问的,对应表示文件私有的符号是non-external...; 出现相同符号,会报错:"ld:dumplicate symbols"; 在其他目标文件里没有找到到符号,会报错:"Undefined symbols"; 另外,链接器在整理函数的符号调用关系时,可以帮助我们理清那些函数没有被调用

    1.6K20

    【C++】学完c语言后的c++基础知识补充!(命名空间、输入和输出、缺省函数、函数重载、引用、内联函数代替宏、nullptr代替NULL)

    注意事项 参数缺省时,必须从右往左连续缺省。 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参 缺省参数不能在函数的声明和定义中同时出现。...C语言不支持缺省参数(编译器不支持) 四. 函数重载 c++允许实现功能类似,参数列表不同的同名函数。 这里的参数列表不同指的是参数的类型、顺序、个数不同 构成函数重载的条件 1....指针和引用的区别(精简三点!) 引用不能指向空值(null),而指针可以。 引用在使用时不需要解引用操作(不需要 * 符号),而指针需要。 引用在定义时必须初始化,而指针可以在后续指向不同的对象。...内联函数 1. 概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方把函数内容展开,从而替换对函数的调用,没有函数压栈的开销,内联函数可以提升程序运行的效率。...因为inline既要要被展开,就没有函数地址了,链接就会找不到 2. c++替代宏的方法 常量定义 :换用const来修饰 函数定义: 换用内联函数 七. nullptr与NULL NULL 预处理后

    7510

    GCC 编译器的使用

    不使用-O'或-O1’选项的目的是减少编译的开销,使编译结果能够调试、语句是独立的:如果在两条语句之间用断点中止程序,可以对任何变量重新赋值,或者在函数体内把程序计数器指到其他语句,以及从源程序中精确地获取你所期待的结果...链接器处理归档文件的方法是:扫描归档文件,寻找某些成员,这些成员的符号目前已被引用,不过还没有被定义。但是,如果链接器找到普通的 OBJ 文件,而不是库文件,就把这个 OBJ 文件按平常方式链接进来。...: : undefined reference to `printf' collect2: ld returned 1 exit status 出现了一大堆错误,因为 printf 等函数是在库文件中实现的...: $ gcc -c -o main.o main.c 链接程序,下面的指令将出错,提示找不到库文件: $ gcc -o test main.o -lsub /usr/bin/ld: cannot find...编译器驱动程序需要使用某些工具,比如:’cpp’,‘cc1’ (或 C++的’cc1plus’),‘as’和‘ld’。

    3.9K31
    领券