阅读:1896回复:17
2000到xp的问题,高手请入,开发环境问题。
我用2000DDK开发的程序运行正常,在XP DDK下重新编译,编译通过,但链接有问题。次程序特殊之处是使用了两个Numega的文件,文件名为cpprt.h和cpprt.cpp。在xp下应该不用这两个文件。在source里面去掉cpprt的编译,编译通过,但是,链接时找不到_atexit()。请高手指教!
cpprt.h和cpprt.cpp是为支持运行库的。但是,xp ddk支持运行库,支持C++编程。我的程序中有一个自己写的class。我曾在source中指定msvcrt.lib库,这样不会出现找不到函数的错误,但是,有一个警告提示“.CRT section exists;there may be unhandled static initializor and teminator”,请高手指点。 帮我解决次问题者,本人送20分。 |
|
最新喜欢:![]() |
沙发#
发布于:2004-03-26 17:49
我用2000DDK开发的程序运行正常,在XP DDK下重新编译,编译通过,但链接有问题。次程序特殊之处是使用了两个Numega的文件,文件名为cpprt.h和cpprt.cpp。在xp下应该不用这两个文件。在source里面去掉cpprt的编译,编译通过,但是,链接时找不到_atexit()。请高手指教! 驱动不能连接msvcrt.lib(C++运行库), 因为驱动运行在Ring0,而C++运行库运行在Ring3. |
|
|
板凳#
发布于:2004-03-26 20:25
注意,这个程序已经在WIN 2000 DDK下编译链接运行通过。所以,您所说的不完全对,但也可能对,就是说,它是否可以用C运行库呢?请您仔细看一下我的描述。cpprt这两个文件你看过没?Numega的东西。先谢了!
|
|
地板#
发布于:2004-03-26 20:45
为了表示诚意,先送5分,请高人详细指明原由和解决办法。
|
|
地下室#
发布于:2004-03-26 21:15
楼上那位,您到将QQ号码给我留下呀。我的是15962986
|
|
5楼#
发布于:2004-03-27 02:18
“.CRT section exists;there may be unhandled static initializor and teminator”这句话已经说得很清楚了,如果你定义了静态的类实例,程序在加载的时候需要自动调用你的那个类的构造子,cpprt.h和cpprt.cpp好象刚好就是干这事的,你去掉当然不行了。
另外,你不可以使用msvcrt.lib,它会链到msvcrt.dll去,你认为可以在Kernel Mode里加载dll吗? C++编程跟操作系统无关,不能说XP就怎么怎么样,我写9x/2k/xp的驱动都用C++,但我从来不去定义静态的类实例,这不好掌握,建议你还是使用new吧(重载new操作符你总会吧?) class X { public: static X* CreateInstance() { return new X; } }; X *x = NULL; DriverEntry(...) { x = X::CreateInstance(); ... ... } 明白我的意思?呵呵。:) |
|
|
6楼#
发布于:2004-03-27 12:17
您所说的肯定是对的。我问个问题。如何用C++写驱动程序?
如果我们要写WIN98操作系统下的驱动程序,想用C++语言,一般都是安装VToolsD等工具编写代码。反正都是用Numega的东西来编写。如果我们直接用98DDK,不用Numega,能用C++写驱动程序吗?写出来的代码能编译过吗? 如果,我们写WIN 2000下驱动程序的代码,我们能用C++语言写吗?或者说2000DDK支持C++语言吗?(不安装Numega的东西) 如果,我们写WIN XP的驱动程序,我们可以直接用C++语言吗?我的意思是XP DDK是直接支持C++语法的吗?(不安装Numega的东西) 对于WIN 2000下的驱动,我用的是2000DDK,在我的驱动程序里加上Numega的两个文件(cpprt.h和cpprt.cpp),我就可以直接用C++语法来编写代码,并且代码运行正常。现在,我想将这个驱动程序移植到XP下,我用XP DDK按照在2000DDK下同样的方式重新编译它,但是,编译无法通过。请指教! [编辑 - 3/27/04 by johnchang] |
|
7楼#
发布于:2004-03-27 12:54
我想给楼上兄弟点分,可是,却不能给了。为什么?
那个给分的按钮怎么不见了呢?难道不能重复给分吗? |
|
8楼#
发布于:2004-03-27 16:34
>> 如果我们要写WIN98操作系统下的驱动程序,想用C++语言,一般
>> 都是安装VToolsD等工具编写代码。反正都是用Numega的东西来 >> 编写。如果我们直接用98DDK,不用Numega,能用C++写驱动程序 >> 吗?写出来的代码能编译过吗? 没问题,我说了,我写VxD或WDM或KMD的时候都用C++,但我从来没 有用过Numega的东西。 >> 如果,我们写WIN 2000下驱动程序的代码,我们能用C++语言写 >> 吗?或者说2000DDK支持C++语言吗?(不安装Numega的东西) >> 如果,我们写WIN XP的驱动程序,我们可以直接用C++语言吗? >> 我的意思是XP DDK是直接支持C++语法的吗?(不安装Numega的 >> 东西) C++跟你说的这些东西都没什么关系,如果你写VxD,大约应该要使用 Visual C++ 5.0或6.0编译,既然它是个C++编译器,那当然必须支持 C++语法。DDK本身的大多数头和库都为C定义的,C++是C的超集, 99.87%在C里能用的东西在C++中一样能用,反正我还没遇到过DDK在 C++里编译不过的情况。 你说的Numega本身只是把DDK里的东东封装后行成一套类库而已,你 可以这样想:Numega的东东到你手里的时候是一堆C++的Source,最 终你要把它变成Lib以致于到可执行的代码的时候,你不是一样得用 DDK环境吗?如果DDK环境里不能用C++,Numega一样不能用。 >> 对于WIN 2000下的驱动,我用的是2000DDK,在我的驱动程序里加 >> 上Numega的两个文件(cpprt.h和cpprt.cpp),我就可以直接用 >> C++语法来编写代码,并且代码运行正常。现在,我想将这个驱动 >> 程序移植到XP下,我用XP DDK按照在2000DDK下同样的方式重新编 >> 译它,但是,编译无法通过。请指教! 呵呵,一定要记住,你可以使用C++语法写驱动并不是Numega的功劳 而是你的编译器的功劳。 你说的移植问题我需要更多的信息才能判断,比如: 1、在XP Build Env里,你把cpprt.h和cpprt.cpp去掉了吗? 2、编译出错的信息是什么? 3、如果加上cpprt.h和cpprt.cpp编译也不能过?出错信息又是什么? |
|
|
9楼#
发布于:2004-03-27 19:43
我用2000DDK开发的程序运行正常,在XP DDK下重新编译,编译通过,但链接有问题。次程序特殊之处是使用了两个Numega的文件,文件名为cpprt.h和cpprt.cpp。在xp下应该不用这两个文件。在source里面去掉cpprt的编译,编译通过,但是,链接时找不到_atexit()。请高手指教! 编驱动用 C++ 很简单。你只要 #ifdef __cplusplus extern "C"{ #endif #include <NTDDK.h> NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath); #ifdef __cplusplus } #endif 就可以。不用 DS 你可以看看 vc 2003.net 中的 crt 源代吗。自己实现一个就可以了 crt 启动代码。就可以搞定 全局类的初始化问题。 |
|
10楼#
发布于:2004-03-29 09:45
去掉cpprt.h和cpprt.cpp编译通过,但链接有问题,说找不到_atexit这个符号,就是说链接不到这个函数。为什么?(我想原因是析构函数需要用它。)
加上那两个文件,提示“.CRT section exists;there may be unhandled static initializor and teminator”,请高手指点。 |
|
11楼#
发布于:2004-03-29 10:56
在我的代码里确实有静态全局变量。这个可能是问题所在,我将它改了试试。
|
|
12楼#
发布于:2004-03-29 11:05
wuyanfeng ,您能不能将启动CRT说的具体一点呢?比如找哪个文件?哪段代码?等等。非常感谢。
所有有价值回复,我都将送分。我会另外开一个送分的主题。我将送分给wuyanfeng和cool-net。二位请留意新贴!其他人的回复,我也将酌情送分。 |
|
13楼#
发布于:2004-03-29 12:56
我现在可以用C++编写代码了,编译过程中没有使用CPPRT等文件(即,cpprt.h和cpprt.cpp等两个Numega的文件)。编译链接都没有大问题。但是,我还不明白如何才可以用全局变量?这涉及CRT的问题。
如果在栈里创建类实例(即,局部变量),没有任何问题。 但如果在全局命名空间创建(即,全局变量),编译通过,在链接时提示无法链接atexit函数。 如果在堆里创建类实例(即,用new操作),编译通过,在链接时无法链接。 在VC的帮助里讲,需要#include <stdlib.h>和libc.lib的支持。DDK中没有关于这个函数的说明。但是,DDK提供<stdlib.h>和libc.lib。 根据以上情况,推断是CRT,即C运行库没有用上,如何使用它呢?请高手指导! 请高手指导,有分奉送! 如果使用cpprt.h和cpprt.cpp两个文件,new操作可以正常,可是,全局还是不行。请高手指点。 [编辑 - 3/29/04 by johnchang] |
|
14楼#
发布于:2004-03-30 15:31
楼主问题搞定了吗?CRT或全局变量,到底是怎样一个关系?
我现在用XPDDK也遇到了同样问题,我的源程序是供应商提供的,里面定义了CRT.CPP,我想会不会是这里的CRT与VC(或DDK)的CRT冲突?如果去掉原来的CRT? 本人第一次接触驱动,不知道问题是不是很菜,还请楼主和其他高手帮忙。 |
|
15楼#
发布于:2004-03-30 18:03
我现在可以用C++编写代码了,编译过程中没有使用CPPRT等文件(即,cpprt.h和cpprt.cpp等两个Numega的文件)。编译链接都没有大问题。但是,我还不明白如何才可以用全局变量?这涉及CRT的问题。 new delete atexit都需要自己实现。 全局变量需要atexit(),可以参照见DriverStudio的stcinit.cpp文件 new delete可以见cpprt.h |
|
|
16楼#
发布于:2004-03-31 18:55
学习!!!!!!!!!!!!!!!!!!! :D |
|
17楼#
发布于:2004-04-03 11:59
我在DDK的MAKFILE.def里看到过c++特性的一些变量的定义,在W2KDDK的包里没有CL。EXE他用的就是C++6。0的CL。EXE
用VC编译和DDK也没有太多不同,都是在LINK上加一个/DRVIER的选项就可以编译。我认为核心的编程和普通编程没有太多的区别。用VC++也应该可行。 :) |
|