有关VC++编译的问题,请教诸位高手。谢谢。
我拿到一个视频卡的SDK,并在它给出的例子的基础上继续做,编译DEBUG版本的时候没有问题,但是在编译RELEASE版的时候出现了一个警告:LINK : warning LNK4089: all references to "SHELL32.dll" discarded by /OPT:REF。于是所有SHELL32.dll中的函数都不能用了,比如说ExitWindowsEx就用不了了。如何才能去掉这个警告呢?究竟是什么导致了这个警告呢?请教诸位高手。谢谢。 问题点数:30、回复次数:33Top
1 楼prog_st(st)回复于 2001-08-22 17:49:42 得分 10
这个警告是由于release版本优化造成的,实际上你的程序中没用到SHELL32.dll中的函数。
ExitWindowsEx使用 User32.dll.
不用管这个警告,如非去掉不可,将以随便使用一个Shell32.dll的函数!Top
2 楼c_d(老土豆花)回复于 2001-08-22 18:06:25 得分 0
但是我使用ExitWindowsEx(EWX_SHUTDOWN,0)关闭计算机,在DEBUG版本下一切正常,可是在RELEASE版本下除了不能正常关机,其他一切正常,好象我没有在程序里写ExitWindowsEx(EWX_SHUTDOWN,0);一样。这个警告不管不成啊,老哥。Top
3 楼roy_hu(roy_hu)回复于 2001-08-22 18:14:30 得分 0
关注Top
4 楼fbc(feng)回复于 2001-08-22 18:19:25 得分 0
是不是16 和32的问题呢Top
5 楼fbc(feng)回复于 2001-08-22 18:19:44 得分 0
SDK 好多都是16的。Top
6 楼c_d(老土豆花)回复于 2001-08-22 18:52:18 得分 0
我这个SDK是32位版本的,绝对没有问题。Top
7 楼jiangsheng(蒋晟.Net[MVP])回复于 2001-08-22 18:59:33 得分 5
看看你的ExitWindowsEx有没有执行到?Top
8 楼crossroad(小A)回复于 2001-08-22 19:28:03 得分 5
如果是windows2000/NT,那么函数ExitWindowsEx必须有SE_SHUTDOWN_NAME权限。
用ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)试试。
Top
9 楼victorlee_lq(victor)回复于 2001-08-22 19:32:32 得分 0
我也遇到了同样的问题,关注!!Top
10 楼c_d(老土豆花)回复于 2001-08-23 08:27:10 得分 0
to jiangsheng:如果ExitWindowsEx没有执行到,则在DEBUG版本中也不能执行到才对啊,可是我的DEBUG版一切正常。
to crossroad:我是在98下运行的,在我以前做的东东里也用过ExitWindowsEx(EWX_SHUTDOWN,0);没有问题的,可以关掉计算机。
to prog_st:实际上SHELL32.DLL包括了User32.dll、Kernel32.dll。这一点你可以使用Visual Studio 6.0 中带的工具Depends,打开Shell32.dll查看就会很明了。Top
11 楼prog_st(st)回复于 2001-08-23 08:33:16 得分 0
正式版显然没用到Shell32中的函数,这是编译器以指明的,你有做何解!Top
12 楼prog_st(st)回复于 2001-08-23 08:38:50 得分 0
反正你的程序没用到Shell32.dll,但系统没说你的程序调用的其他DLL没有用到Shell32.dll,我觉得你将注意力只看Shell32上,是没必要的。应该具体找找ExitWindowsEx为什么没调用!
Top
13 楼mickeypeng(鹏)回复于 2001-08-23 08:41:35 得分 0
怎么知道哪个是debug版本,哪个是release版本啊????Top
14 楼c_d(老土豆花)回复于 2001-08-23 09:18:34 得分 0
to prog_st:呵呵,不是我没有用到啊,是编译器的那个警告说不让用啊。我就是想知道怎么才能去掉那个警告让我用啊。我认为ExitWindowsEx没有被调用的原因就是,编译器提示的那个警告all references to "SHELL32.dll" discarded by /OPT:REF,所以没有被调用啊,或者说ExitWindowsEx的调用被忽略了啊。Top
15 楼c_d(老土豆花)回复于 2001-08-23 14:49:43 得分 0
我想警告all references to "SHELL32.dll" discarded by /OPT:REF中OPT的意思应该是选项,选项REF导致了all references to "SHELL32.dll" discarded。可是我找了半天也没有找到这个选项是在哪里选的,应该在什么地方去掉它呢?Top
16 楼zj_ok(zj_ok)回复于 2001-08-23 15:10:40 得分 0
gzTop
17 楼happylaodu(青菜豆腐)回复于 2001-08-23 15:39:02 得分 5
/OPT是Link的参数设置吧,你看一下Project/Settings Release版里面Link页有没有这项设置.
Top
18 楼jiangsheng(蒋晟.Net[MVP])回复于 2001-08-23 15:49:41 得分 0
有没有放在#ifdef _DEBUG里面?Top
19 楼c_d(老土豆花)回复于 2001-08-23 16:20:41 得分 0
to happylaodu:
我看了Project/Settings Release版里面Link页Project Options中为:********.Lib /nologo /subsystem:windows /incremental:no /pdb:"Release/XXXX.pdb" /machine:I386 /out:"Release/XXXX.exe" /libpath:"..\..\lib" 其中******是SDK提供的一个库,用于操作视频卡的,XXXX是我的应用程序的程序名。没有看到“/OPT”。
to jiangsheng:
我的#ifdef _DEBUG和#endif之间只有以下几句:
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
没有别的。
大家救命啊~~~~~
Top
20 楼gongxy(codekiller)回复于 2001-08-23 16:52:11 得分 3
prog_st(st)说的没错
好好查查你的程序Top
21 楼c_d(老土豆花)回复于 2001-08-23 16:57:14 得分 0
to gongxy:
那么可能是什么原因导致了我的程序在DEBUG版本中调用ExitWindowsEx(EWX_SHUTDOWN,0);是成功的,可是到了RELEASE版本中调用就不成功呢?Top
22 楼happylaodu(青菜豆腐)回复于 2001-08-23 17:26:11 得分 0
ExitWindowEx我是好长时间以前用的了,当时或许敢碰到过你说的这个问题:在Debug和Release下表现的不一样。
我看了一下,我现在的程序中用的是:
::ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,NULL); Release版本,可正常关机
Top
23 楼c_d(老土豆花)回复于 2001-08-23 17:34:05 得分 0
to happylaodu:
可是使用EWX_FORCE标志是强制关机啊,应用程序会丢掉数据的,我可是想让我的应用程序正常退出,然后关机啊。拜托,青菜豆腐,帮我想个主意吧。谢谢了。Top
24 楼c_d(老土豆花)回复于 2001-08-24 13:55:09 得分 0
最近,好象有很多人在编译的时候都遇到这样的警告。有没有人知道这种警告是怎么产生的呢?如何才能去掉呢?Top
25 楼jiangsheng(蒋晟.Net[MVP])回复于 2001-08-24 14:45:08 得分 0
ExitWindowsEx
The ExitWindowsEx function either logs off the current user, shuts down the system, or shuts down and restarts the system. It sends the WM_QUERYENDSESSION message to all applications to determine if they can be terminated.
Top
26 楼12345678()回复于 2001-08-24 15:07:07 得分 2
VC中Release版连接优化造成的。应该没有问题!视频卡我做的多了,经常会有这种问题。
你可以看一下连接开关中一定有/OPT:REFTop
27 楼c_d(老土豆花)回复于 2001-08-24 15:39:43 得分 0
to jiangsheng:呵呵,MSDN里是这么说的,但是在后面还有关于使用EWX_FORCE标志的说明,是这么说的:Forces processes to terminate. When this flag is set, the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency.
to 12345678:能不能说得具体一些,连接开关中的/OPT:REF在什么地方啊,我找了两天了都没有找到啊,55555。Top
28 楼c_d(老土豆花)回复于 2001-08-24 17:38:12 得分 0
to prog_st:你的意思是说,我在RELEASE版本里ExitWindowsEx没有执行,根本就和那个警告没有关系?55555555555,那就奇怪了啊,我的DEBUG版本明明是好好的啊,555555,我总不能让用户拿DEBUG版去用吧,5555555,救命啊,帮我搞定这个问题分数好商量啊,555555。Top
29 楼c_d(老土豆花)回复于 2001-08-25 13:23:51 得分 0
问题解决,prog_st说得对,果然出的问题和那个警告没有关系,是我的代码其他地方的问题,感谢大家参与和提醒,谢谢,加分。:)Top
30 楼roy_hu(roy_hu)回复于 2001-08-25 20:56:17 得分 0
to c_d:
那为什么你的debug版本能够运行到呢?Top
31 楼c_d(老土豆花)回复于 2001-08-27 11:39:37 得分 0
to roy_hu:我做了一个判断,当变量a的某位为1(二进制)的情况下才执行那行代码。我使用了让a右移若干位,然后mod 2 的方法。我应该把a定义为BYTE类型,但是我没有注意,不小心定义了一个int型。在RELEASE版本下,符号位起作用,返回结果为-1,总不等于1,所以没有执行到。DEBUG版本下,返回结果为1,就执行到了,呵呵。Top
32 楼roy_hu(roy_hu)回复于 2001-08-27 16:42:32 得分 0
有这么多讲究啊,你怎么知道的Top
33 楼c_d(老土豆花)回复于 2001-08-27 18:43:12 得分 0
to roy_hu:呵呵,试出来的。在RELEASE版里不能用单步跟踪,设了好多MESSAGEBOX呵呵。Top




