error: LNK2019与error: LNK1120可能的原因及解决方法

今天又碰到了报错“LNK:2019”和“LNK:1120”,记录一下。

user_interface.obj:-1: error: LNK2019: 无法解析的外部符号 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl user_interface::alter_str(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,char)" (?alter_str@user_interface@@QEAA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V23@D@Z),该符号在函数 "public: void __cdecl user_interface::update_notification(void)" (?update_notification@user_interface@@QEAAXXZ) 中被引用

还有

release\attendance_management.exe:-1: error: LNK1120: 1 个无法解析的外部命令

报错的代码在头文件的声明为

std::string alter_str(std::string target_str,char delete_char);

在cpp文件的定义为

std::string alter_str(std::string target_str,char delete_char)
{
//int length=Target.length();
std::string::iterator it_i;
for(it_i=target_str.begin();it_i!=target_str.end();it_i++)
{
    if(*it_i==delete_char)
    {
        target_str.erase(it_i);

    }
}
return target_str;
}

调用部分为

time_str=alter_str(time_str,'-');

其中time_str是std::string类。

这里错误的原因为:
在cpp文件里定义函数时,没有把类名标上去,犯了类似于声明但没有定义的错误,导致报错。

正确的做法是在cpp文件里函数定义那里把类名(user_interface::)加上,如下:

std::string user_interface::alter_str(std::string target_str,char delete_char)
{
//int length=Target.length();
std::string::iterator it_i;
for(it_i=target_str.begin();it_i!=target_str.end();it_i++)
{
    if(*it_i==delete_char)
    {
        target_str.erase(it_i);

    }
}
return target_str;
}

就此,本次问题得以解决。

顺便再整理一下“error: LNK2019”、“error: LNK1120”报错的可能原因及相应可能的解决方法。
可能原因及相应可能的解决方法:
1、你使用了别人的库,然后还只包含了头文件而没有引入库文件,以至于在链接过程中搜索不到程序用到的库文件,也就是*.lib。例如在使用opencv时,没有添加附加依赖项,或者没有添加可执行文件目录、包含目录、库目录,没有在系统环境变量里添加可执行文件路径等等,如下图
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
2、声明了一个函数却没有定义,或声明并定义了一个函数,但在定义该函数时没有加上其的类名或空间名,例如上面的 user_interface::
关于“::”,多用于表示方法引用(函数式接口的另一种书写方式),如
静态方法引用,通过类名::静态方法名, 如 Integer::parseInt
实例方法引用,通过实例对象::实例方法,如 str::substring
构造方法引用,通过类名::new, 如 User::new
3、把类模板函数实现放到类的cpp文件中,然后在main函数中使用这个类的时候,就会出现无法解析的外部符号:函数名(xxxx)等错误,错误的原因就是现在的编译里不支持模板函数的申明和实现分开,要像上面那样使用类成员函数,有以下两种方法
a.在使用这个类的文件中包含#include“xxxx.cpp”
b.在类头文件末尾包含模板实现函数’#include"xxxx.cpp
4、缺少目标.obj文件。重新设置文件编译路径并重新编译即可。

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值