首页
学习
活动
专区
工具
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删除,由编译器自己决定也可以

15.5K51

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

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

3.6K20

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

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

17320

认识目标文件符号

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

1.5K40

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

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

4.1K20

【编程基础】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这样符号

96330

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

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

12710

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

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

1.8K10

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相关头文件包含添加一个

2.6K21

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

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

23510

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

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

19910

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

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

81620

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

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

73620

iOS编译原理

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

1.5K20

C++基础知识复习

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

52110

【面试宝典】c调用c++函数,为什么要加extern c

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

1.8K140

c和c++区别 (一)函数默认值、内联函数函数重载和cc++之间相互调用

一.函数默认值 c++支持给函数形式参数进行默认初始化,其规则为右向左依此初始化。 还有以下需要注意几点: 1.定义处可以不给出形参默认值,在声明处可以给出形参默认值。...b);//由于上一个声明已经将b初始化为10,所以符合右向左依此初始化规则 int sum(int a=10,int b);//错误,不符合规则 函数默认值存在意义是什么?...链接核心就是符号重定位,即在符号 引用地方找到符号定义地方,这时候发现符号相同,因此产生了链接错误。而在c++当同名称函数产生符号也是不相同。...std; int sum(int a,int b);//在main.cpp生成符号为 sum_int_int 而在sum.c中生成sum 这样必然导致链接错误找不到sum_int_int...extern "C" { int sum(int a,int b);//在main.cpp生成符号为sum和在sum.c中生成符号sum一致 //这样链接进行符号重定位时候,在符号引用地方找到符号定义地方

68610

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.8K31

【一站式解惑】Linux中.a、.so和.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等

• 理论上可以链接obj文件来引用其他工程(可以认为一个obj文件等价于编译生成它cpp文件,可以引用obj来替换cpp,也可以添加cpp来替换obj ),但实际中通常用lib来实现工程间相互引用。...在Linux下,共享库加载是由/lib/ld.so完成ld.so加载共享库时,会ld.so.cache查找。 创建函数库示例 我们通常把一些公用函数制作成函数库,供其它程序使用。...只需要在使用到这些公用函数源程序中包含这些公用函数原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会静态库中将公用函数连接到目标文件中。...快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。...附: 像下面这样指定路径去链接系统静态库,会报错说要连接找不到: g++ -o main main.cpp -L/usr/lib libpthread.a 必须下面这样才正确: g++ -o main

4.1K52

C++初阶-入门基础语法

符号表中找Add地址,然后链接到一起 链接时,面对Add函数,连接器会根据编译器自己函数名修饰规则去找对应出现函数,而C/C++命名修饰是不同 示例:使用gcc演示修饰后函数名字 采用C...; return 0; } //链接时报错:error LNK2019: 无法解析外部符号_Add,该符号函数 _main 中被引用 六、引用 ---- 概念: 语法上来说,引用不是新定义一个变量...,编译器会自动优化(对于函数体内有循环/递归等内联,编译器优化时会忽略) inline不建议声明和定义分离,分离会导致链接错误。..." int main() { f(10); return 0; } // 链接错误main.obj : error LNK2019: 无法解析外部符号 "void __cdecl f...f@@YAXH@Z),该符号函数 _main 中被引用 相关面试例题: 例题1:宏优缺点?

67420
领券