描述:
这两天在写一个组件,是个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使用产生随机数的函数啊?
解决方案1:
将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。
这个问题跟 rand() 函数无关,相信是工程设置问题。