收录日期:2020/05/29 15:46:04 时间: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

如何保留每一个段落前的两个空格? Webbrowser控件使用小问题? 同一个jsp程序,为什么运行的两个不同的结果?? 自己建立一个简单的DBMS,遇到了这样的问题->>> 怎样才能得到单文档的客户区域(白色可写部分)的句柄? 如何实现popup页面向父页面发送数据 关于cisco 2600的问题,急,来者有分 问一个改换界面风格的问题。 我这有一段vc代码,如何把它编成dll让pb调用 dns问题?服务器上访问正常,其他地方就访问不了,为什么? 怎摸样在VB中读取和程序同一目录下的文件,\"/filename\"是不是不行? exchang服务器不区分重要/非重要邮件怎么办? 我用了jbuilder里的borland公司的控件,是不是必须在装jbuilder的机器上才能运行呢? 我来看看 50分 求助弱问题-------------------[ 菜鸟的呼声 ] 请大家评价一下下面的几本MFC方面的书吧 :) IBM的硬盘主板时常找不到。 菜鸟问题,为什么我加入Splitter Bar后在mainframe中不显示分割条? 请问大家windows media player怎么卸掉啊? 求职:找南京的软件开发工作 有没有判断是否为小数的函数,比如Isinteger()之类的? FTP的LIST命令 请问:用MSCOMM控件,怎么初始化串口? FTP 的LIST命令 一个是SUN JDK一个是MS JDK,怎么回事吗? Web.config文件中的appSettings值的引用 POS 机的通讯 谁有开发文档的格式啊?高分送上 急,请问如何在c#里延时打开一个页面,在先等待 谁能解释一下ping源程序中有关校验和的补码的算法!