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语言的编译方式。所以这样也可以解决问题。

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

 

你可能感兴趣的:(内核)