奇怪的问题,ATL开发COM组件时如何产生随机数,用rand()在Release模式下出错

milee 2006-08-04 04:17:34
这两天在写一个组件,是个DLL,不支持MFC,我想要产生随机数,用了rand()这个函数,在Debug模式下一切OK,但是我使用Release模式时确出错了,
LIBCMT.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
ReleaseMinSize/Calc.dll : fatal error LNK1120: 1 unresolved externals
说是无法解析这个外部标识,
我查了一下MSDN,发现rand()是在stdlib.h中声明的,我把这个文件包含进来还是出错,
MSDN中关于rand()函数还有这个说明:
Libraries
All versions of the C run-time libraries.
这是不是说使用这个函数需要C run-time libraries?有什么帮助没有。
各位大侠,有什么办法解决这个问题,怎样在ATL使用产生随机数的函数啊?
...全文
239 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanilyer 2006-08-04
  • 打赏
  • 举报
回复
将Project Release设置中的预定义_ATL_MIN_CRT去掉就可以了


原因
在使用 ATL 时,您可能希望达到的两个目标是:

最大限度地减小图像的大小
最大限度地减少对运行时 DLL 的依赖
然而,可能需要利用 CRT 提供的某些函数。由于静态链接会增加图像大小,而动态链接使您依赖于运行时 DLL,因此使用 CRT 可能使您达不到这些使用 ATL 的主要目标。

为了帮助解决这个两难局面,ATL 提供了一个解决方案,即 _ATL_MIN_CRT 宏。通过将常规属性选项“在 ATL 中最小使用 CRT”设置为“是”可激活 _ATL_MIN_CRT 宏,这个宏为许多本来需要 CRT 启动代码的公共 CRT 函数提供了替换实现。

记住,使用 _ATL_MIN_CRT 宏并不能保证不需要 CRT 函数。如果使用的函数需要 CRT 启动代码才能正常运行,则将得到下列链接器错误:

LIBCMT.LIB(crt0.obj) : error LNK2001: unresolved external symbol _main
提供自己的 _main 实现并不能解决这个问题:必须消除对需要 CRT 启动代码的函数的依赖,或者必须在图像中静态链接启动代码或动态链接到 CRT。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧