收录日期:2019/05/22 09:32:34 时间:2016/07/11 17:19:23 标签:进程/线程/DLL
刚装的VS2008,很陌生,碰上个问题;

工程属性选择“忽略所有默认库”,如下代码链接错误:

char path[260] = {0};
GetCurrentDirectory(260, path);

VS2008链接时提示 无法解析的外部符号_memset,亦就是说,它VS2008把char path[260] = {0};这样的语句展开为使用memset帮你填0咯,VC6好像不是这样;而且,同样的代码,同样是“忽略所有默认库”,可以成功链接,VS2008就不行;

于是我加上这句:#pragma comment(linker,"\defaultlib:msvcrt.lib"); //因为memset是在msvcrt.lib中的。结果VS2008好像不认 #pragma comment 这些命令了,无效,写了当没写;于是只好在工程属性里的链接命令行里加上 msvcrt.lib ,链接通过了!

但是链接出来的程序,运行里提示:找不到msvcr90.dll,程序无法启动;就是说装载程序时找不到这个DLL,windows装载器拒绝装载这个程序了;

我不明白,需要的库我已包含了,链接也通过了, 它还找不到这个DLL?

VC6就不会有这些情况,很怕,这样子看来,VS2008搞出来的东西,编译、链接时0错误,0警告,而程序都还是十分有可能错误一大堆而无法运行;

郁闷;
这个问题我不知道,但是,我帮顶,希望能快点解决,我也学习下!
不知什么情况下需要“忽略所有默认库”
默认是不忽略的,我觉得还是用默认的设置吧
这个不要担心。
首先VS2008 创建新工程默认是Unicode,所以
char path[260] = {0}; 
GetCurrentDirectory(260, path); 
可能编译不过。因为GetCurrentDirectory API是Unicode的换成TCHAR 或者 wchar就可以。

其次,VS2008 对标准支持的更好。以前VC6的时候,好多地方使用的都不标准,而且也不
安全。VS2008就好了很多。

你说的_memset,我没用过,但我使用过memeset。
char path[260] = {0};
memeset(path,260,0);
没有任何问题。
_memset函数我在msdn中没有找到。
你说的_memset,我没用过,但我使用过memset。 
char path[260] = {0}; 
memset(path,260,0); 
引用 3 楼 sad_4978 的回复:
这个不要担心。 
首先VS2008 创建新工程默认是Unicode,所以 
char path[260] = {0}; 
GetCurrentDirectory(260, path); 
可能编译不过。因为GetCurrentDirectory API是Unicode的换成TCHAR 或者 wchar就可以。 

其次,VS2008 对标准支持的更好。以前VC6的时候,好多地方使用的都不标准,而且也不 
安全。VS2008就好了很多。 

你说的_memset,我没用过,但我使用过memeset。 
char path[260] = {0}; 
memeset(path,2…


VS2008创建的工程默认是Unicode, 我已经在工程属性里改为"未知字符集"了,不然char path[260] = {0};GetCurrentDirectory(260, path); 这两句在编译时就通不过,更不要说链接了;

另, _memset, 事实上就是memset, 之所以在函数前加上"_"(不是我加的),是因为链接器针对一种调用方式(或其它),在链接时自动加上"_"而已;

我还是想说一下的是, VS2008用memset当然是可以,但是说过, 前提是"忽略所有默认库";
你不用这么搞吧,直接不用UNICODE,直接用多字符集,不就行了啊。我看你这几句没那么麻烦的。八成是你想歪了。你直接用多字符集,改动就比较简单了,实在不行,你发给我也行啊。我帮你调试下,我一直用的VS2008的,只是有些函数修改了下,但是大体的功能都在的
我知道是怎以回事了, 运行里提示:找不到msvcr90.dll,程序无法启动; msvcr90.dll 是运行时库, vs2008链接出来的程序要依赖这个运行时库才能执行;
引用 7 楼 FortheC 的回复:
我知道是怎以回事了, 运行里提示:找不到msvcr90.dll,程序无法启动; msvcr90.dll 是运行时库, vs2008链接出来的程序要依赖这个运行时库才能执行;


-------------------------------------------------
这个是开发平台的,使用静态MFC,或者静态windows库,有这个编译选项。你这样就连这些都省了。
unicode和多字节的关系,楼主可以先从多字节开始
这个应该是unicode的问题,我也遇到了这样的问题,
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
MessageBox("View");
CFrameWnd::OnLButtonDown(nFlags, point);
}
上面的程序在编译的时候会报这样一个错误:
 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [5]”转换为“LPCTSTR”
上面的问题就是编译系统默认为unicode字符的原因。在"View"前加个L就ok了。如下:
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
MessageBox(L"View");
CFrameWnd::OnLButtonDown(nFlags, point);
}
重提一次, 与unicode无关; 问题就出在VS2008默认链接出来的程序需要msvcr90.dll这个运行库; 把msvcrt.lib这个库忽略掉即可; 至于我上面所说的memset的问题, 是因为memset这个函数就在运行时库里; 不要用memset来填0就行了,用SecureZeroMemory来填0;

用vs2008建的项目,如果不改默认配置,就算是release方式链接出来的程序,也无法在其它机子上运行,因为其它机子没有msvcr90.dll这个运行时库; 把这个运行时库忽略掉即可;

至于别人说的使用静态的MFC之类的,会加大程序体积;

另外还需要注意的是,同时要把C/C++选项卡中的运行时库改为"多线程(/MT)" ->对于exe程序来说;

对于MFC程序就好像一定要用静态使用MFC了,不能使用共享DLL的方式,不然生成出来的程序一样也无法在其它机子上运行,因为XP自带的只是MFC42.DLL, VS2008需要的是MFC90.dll

如果网站是图片比较多 应该用什么数据库去存储信息呢? 騰信, sina, taobao這些公司的架構師工資多少? C语言写的雅可比算法求矩阵特征向量和matlab求的结果不一样,怎么回事? Datagridview绑定TreeView ttpConnection的读取速度问题 winsock重叠IO的完成例程是不是1.1版本用不了 大家给些建议吧,谢谢 再请教二个问题 关于Exif 图片信息自定义添加问题 问下搞web开发的 采集循环入库问题 开发手机网站,用什么框架合适呢? asp.net事件綁定 她能做到以下十条,你就放弃吧,因为她真不喜欢你 如何使得自己能真正的成长起来! MFC界面问题 请问,string类的 如何生成一个 -5到 0 的随机数 关于编辑框的通知消息及其映射函数 怎么取值? 数据转换问题 java socket 多线程同时调用 执行sql语句报错,求助! 任何人都有两面,看看卡扎菲好的一面。 JSP 登录2个ID 后session问题 我的CentOS为什么不能上网,有ifconfig的图 REORG 问题 border-radius圆角被遮盖怎么处理? 关于server.transfer获取值的问题,急! Java控制台读取字符的问题