“-MTd”和“-clr”命令行选项不兼容

“/MTd”和“/clr”命令行选项不兼容我建立mfc的dll项目,dll类型选择:使用共享 MFC DLL 的规则 DLL(D) ,在这个dll中我有调用了C#的dll,它提示我:1>.\QtdiaoCsharp.cpp(6) : fatal error C1190: 托管目标代码需要“/clr”选项,我就将公共语言运行库支持(/clr)选中就可以运行了,但是在其他没有安装vs的电脑上运行提示我需要安装vs的库。
我就重新建立mfc的dll项目,dll类型选择:带静态链接 MFC 的规则 DLL(R) http://www.xmenwolverine.com,我就将公共语言运行库支持(/clr)选中运行提示我有错误:1>cl: 命令行 error D8016 :“/MTd”和“/clr”命令行选项不兼容。这个怎么办?请高手指教。项目属性->C/C++->代码生成->运行时库->Release选MD,这样试试。
其实这样什么都没装的机器还是会缺dll(2003msvcr71.dll、2005msvcr80.dll等等),不过不确定C#的运行时库会不会把这个装上,如果它

fflush(stdout)的用途是什么?

已经装上了,那你这个就能运行了,否则就只有你把这个缺少的文件放exe同目录里面用了@@個依賴有點}}雜,c++的{{觕##礵lll,你換個方式吧。比如webservice那NN調用。回复 2# w_anthony 


按您说的方法又有新的错误了:>E:\vs2008\VC\atlmfc\include\afx.h(24) : fatal error C1189: #error :Building MFC application with /MD (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD回复 2# w_anthony 


我用depend查看dll,将提示的少的dll都加进去了,可是还是不能运行我用的是VS2003,它的afx.h里面没有检测_AFXDLL和MThttp://www.gxgjhotel.com的兼容性,所以可以改成MD方式,然后手工定义__argc、__argv和_mbctype等几个变量就可以通过编译,不过这种方法有很多注意事项,有些直接访问MFC类成员变量的方法(通过成员函数访问可以)可能会不能在这种模式下正常工作,所以一般不建议这么做。

VS2008直接在afx.h里面检测这个兼容性,那就不好办了,如果定义了_AFXDLL就会和“在共享DLL里面使用MFC一样了”,当然也可以把afx.h里面的代码拷到其他.h里面去掉兼容性检测再包含这个.h,并主动定义__AFX_H__阻止包含原afx.h,但这毕竟不是正道,也不推荐。


转载:http://dorothyw13.blog.163.com/blog/static/169778237201239113357180/



众所周知,c#编译器编译代码为托管代码,可以使用vs自带的返编译工具查看代码结构,而vc不但能够编译非托管代码,使得不能被反编译,它又能编译托管代码,不过新建工程的时候默认的是非托管代码。这样一来在vc中调用c#编译出来的dll文件就会产生一些问题:

fatal error C1190: 托管目标代码需要“/clr”选项

可以更改环境配置进行解决:属性->配置属性->常规->公共语言运行时支持,改为:公共语言运行时支持(/clr),这样编译器就会产生托管代码,因为产生的最终文件不是二进制文件,所以生成的exe文件要比非托管的大很多。

vs2010添加dll文件也很方便,与c#环境的类似,只不过vs2010的添加要在属性->框架和引用->添加新引用。还有要注意的地方是.h文件不能定义为托管,因此在.h文件内部定于诸如PTZControl::PTZControl^ pcontrol;的变量会出现错误:

error C3265: 无法声明托管“pcontrol”(在非托管“CmyFfplayDlg”中)
1>          不能声明全局或静态变量,也不能声明引用 gc 堆中对象的本机类型成员

查了很多资料,终于有了解决办法:将上述变量定义为:gcroot<PTZControl::PTZControl^> pcontrol;解决了托管代码不能定义全局变量以及静态变量问题。

实例化C#的类不要使用c++中的方式,使用“^”号代替间接寻址指针操作符“*”。而用gcnew代替new。

开发期间如果用到字符串传递参数,比如vc的CString 向C#的string传递,直接传递是不能传递成功的,需要进行转换,我使用这样的:

System::String^ m_SerIp = gcnew System::String(m_ServerIp);//m_Server 为CString类型
System::String^ m_CliIp = gcnew System::String(m_ClientIp);

还有很多方式,在网上查找一下便可,不过似乎很多方式可能不能实现。


转载:http://blog.csdn.net/lxp116/article/details/8363644

你可能感兴趣的:(“-MTd”和“-clr”命令行选项不兼容)