error LNK2019: unresolved external symbol _DriverEntry@8 referenced in function _GsDriverEntry@8

       对于大多数驱动开发初学者来说,有时候我们写的代码,或者在网上copy的代码,你会发现编译程序是出现这样的错误error LNK2019: unresolved external symbol _DriverEntry@8 referenced in function _GsDriverEntry@8
e:\vs2008~1\listpr~1\listpr~1\objchk_win7_x86\i386\ListProcess.sys : fatal error LNK1120: 1 unresolved externals

       当你在怀疑自己的代码,或者你看到的博客文章时。其实你大可不必有这样的疑虑,居然编译器没有提示是代码编写出错,那么你的代码编写是正确,想想或许是其他原因。这里不卖关子了,直接告诉大家我其实是编译器骗了你。我们下来说说这事什么错误——这是一个链接错误,原来是系统在链接时找不到入口函数_DriverEntry@8。在VS2008或者VS2010中编译默认的编译方式是采用C++方式。错误意思:显然是C编译器对DriverEntry进行编译后的结果,前缀“_”是C编译器特有的,后缀@8”是所有参数的长度。原来我们现在使用的是C++编译器,一定是它把DriverEntry编译成了系统无法认识的另一副模样了(实际上,C++编译器会把它编译成以“?DriverEntry@@”开头的一串很长的符号)。到这里我想你应该猜到怎么解决这个问题了。

我这里提供两个解决方法:

方法一:

   在这个函数前面加上extern "C"修饰符,上述问题即立刻消失了。extern "C"提醒编译器要使用C编译格式编译DriverEntry函数,这样编译生成的函数名称为_DriverEntry@8”,链接器即可正确地识别出符号了。编译后错误就消失了。这里大家要记得哟,如果下次不是函数DriverEntry 而是其他函数XXXXX也可以采用相同的方法。这叫举一反三,学习方法很重要!

方法二:

   这个方案其实很简单,直接把.cpp文件的改成.c文件。为什么这样也可以呢?简单说说,我们的.cpp文件采用的是C++的编译的方式,而.c文件采用的是C语言的编译方式。所以这样也可以解决问题。

   我个人建议大家使用方法一,这样代码的移植性会相对增加。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值