vs2010怎么修改编译选项将/md或/mdd 改为 /mt或/mtd

2024-05-05 23:23

1. vs2010怎么修改编译选项将/md或/mdd 改为 /mt或/mtd

vs2010怎么修改 LNK4098: defaultlib "LIBC" conflicts wi

vs2010怎么修改编译选项将/md或/mdd 改为 /mt或/mtd

2. MD和MT的区别

/MD 
 使应用程序使用运行时库的多线程并特定于 DLL 的版本。定义 _MT 和 _DLL,并使编译器将库名 MSVCRT.lib 放入 .obj 文件中。 

用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR80.DLL 中,该库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。

当在定义了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情况下使用 /MD 时,它将导致应用程序与静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 链接,同时仍通过 msvcrt.lib 动态链接到主 CRT。
 
/MDd 
 定义 _DEBUG、_MT 和 _DLL,并使应用程序使用运行时库的调试多线程并特定于 DLL 的版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。 
 
/MT 
 使应用程序使用运行时库的多线程静态版本。定义 _MT 并使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析外部符号。
 
/MTd 
 定义 _DEBUG 和 _MT。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。 
 
/LD 
 创建 DLL。

将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。 

链接 DLL 启动代码。

如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。

将 /Fe(命名 EXE 文件)解释为命名 DLL 而不是 .exe 文件;默认程序名成为 basename.dll 而不是 basename.exe。

除非显式指定 /MD,否则将暗指 /MT。
 
/LDd 
 创建调试 DLL。定义 _MT 和 _DEBUG。

3. vs2010 里面 运行时库不同的库能放在一个程序里调用么?(比如两个库分别是MTd 跟MDd)

不能。


LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library
You are trying to link with incompatible libraries. Important   The run-time libraries now contain directives to prevent mixing different types. You’ll receive this warning if you try to use different types or debug and non-debug versions of the run-time library in the same program. For example, if you compiled one file to use one kind of run-time library and another file to use another kind (for example, single-threaded versus multithreaded) and tried to link them, you’ll get this warning. You should compile all source files to use the same run-time library.
总之,一句话,lib 之间有冲突。需要删除导入的一些libs 。




VC编译选项 多线程(/MT)
多线程调试(/MTd)
多线程 DLL (/MD)
多线程调试 DLL (/MDd)
C 运行时库                        库文件
Single thread(static link) ML            libc.lib
Debug single thread(static link) MLd        libcd.lib
MultiThread(static link) MT            libcmt.lib
Debug multiThread(static link) MTd            libcmtd.lib
MultiThread(dynamic link) MD            msvert.lib
Debug multiThread(dynamic link) MDd        msvertd.lib 
3. 各种 C 运行时库的区别
( 1 )静态链接的单线程库
静态链接的单线程库只能用于单线程的应用程序, C 运行时库的目标代码最终被编译在应用程序的二进制文件中。通过 /ML 编译选项可以设置 Visual C++ 使用静态链接的单线
程库。
( 2 )静态链接的多线程库
静态链接的多线程库的目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程程序中使用。通过 /MT 编译选项可以设置 Visual C++ 使用静态链接的多线程库。
( 3 )动态链接的运行时库
动态链接的运行时库将所有的 C 库函数保存在一个单独的动态链接库 MSVCRTxx.DLL 中, MSVCRTxx.DLL 处理了多线程问题。使用 /MD 编译选项可以设置 Visual C++ 使用动态
链接的运行时库。
/MDd 、 /MLd 或 /MTd 选项使用 Debug runtime library( 调试版本的运行时刻函数库 ) ,与 /MD 、 /ML 或 /MT 分别对应。 Debug 版本的 Runtime Library 包含了调试信息
,并采用了一些保护机制以帮助发现错误,加强了对错误的检测,因此在运行性能方面比不上 Release 版本。 
下面是msdn关于Visual C++ 编译器选项的说明:
这些选项选择单线程或多线程运行时例程,指示多线程模块是否为 DLL,并选择运行时库的发布版本或调试版本。
选项     说明
/MD     定义 _MT 和 _DLL 以便同时从标准 .h 文件中选择运行时例程的多线程特定版本和 DLL 特定版本。此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中。
用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR71.DLL 中,该库必须在运行时对于与 MSVCRT.lib 链
接的应用程序可用。
当在定义了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情况下使用 /MD 时,它将导致应用程序通过静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 进行链接
,同时仍通过 msvcrt.lib 动态链接到主 CRT。
/MDd     定义 _DEBUG、_MT 和 _DLL,以便从标准 .h 文件中选择运行时例程的调试多线程特定版本和 DLL 特定版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。
/ML     使编译器将库名 LIBC.lib 放入 .obj 文件中,以便链接器使用 LIBC.lib 解析外部符号。这是编译器的默认操作。LIBC.lib 不提供多线程支持。
/MLd     定义 _DEBUG 并使编译器将库名 LIBCD.lib 放入 .obj 文件中,以便链接器使用 LIBCD.lib 解析外部符号。LIBCD.lib 不提供多线程支持。
/MT     定义 _MT,以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析
外部符号。创建多线程程序需要 /MT     或 /MD(或它们的调试等效选项 /MTd 或 /MDd)。
/MTd     定义 _DEBUG 和 _MT。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使
用 LIBCMTD.lib 解析外部符号。创    建多线程程序需要 /MTd 或 /MDd(或它们的非调试等效选项 /MT 或 MD)。
/LD     创建 DLL。
将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。
链接 DLL 启动代码。
如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。
将 /Fe 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称.dll 而不是基名称.exe。
如果还未显式指定 /M 选项之一,则将默认运行时库支持更改为 /MT。
/LDd     创建调试 DLL。定义 _DEBUG。
    警告   不要混合使用运行时库的静态版本和动态版本。在一个进程中有多个运行时库副本会导致问题,因为副本中的静态数据不与其他副本共享。链接器禁止在 .exe 文件内
部既使用静态版本又使用动态版本链接,但您仍可以使用运行时库的两个(或更多)副本。例如,当与用动态 (DLL) 版本的运行时库链接的 .exe 文件一起使用时,用静态(非 
DLL)版本的运行时库链接的动态链接库可能导致问题。(还应该避免在一个进程中混合使用这些库的调试版本和非调试版本)。

vs2010 里面 运行时库不同的库能放在一个程序里调用么?(比如两个库分别是MTd 跟MDd)

4. 由于应用程序配置不正确,应用程序未能启动。

net framework 4.0装一下 还有vc2008什么的用云端试下。还有是不是D什么那个显卡的版本低了,最低要10的吧

5. VS 多线程调试和多线程DLL调试有什么区别

区别是动态链接还是静态链接C运行时库(C runtime Library, CRT)。

如果是动态链接(MD/MDd),你的程序就依赖C运行时的动态链接库(比如VS2010的msvr100.dll),当你的程序在其他没有这个dll的电脑上运行就会出现错误(找不到这个dll)。

如果是静态链接(MT/MTD),C运行库直接链接到你的程序里,你的程序就不依赖C运行时库的dll了。

微软是推荐是用动态链接的,因为这种链接方式可以减少可执行文件的大小、可以减少内存的使用、避免链接问题。

VS 多线程调试和多线程DLL调试有什么区别

6. PCSX2SP程序设置不正确

楼主你好:1.修改编译选项,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。 2.工程-》属性-》配置属性-》常规-》MFC的使用,选择“在静态库中使用mfc”
这样生成的exe文件应该就可以在其他机器上跑了。 谢谢

7. 关于Visual C++ .net 在没有.net框架机器上运行的问题

c++不是基于.net的,可以不用

c#程序是一定要framework的

就像JAVA也需要平台支持一样

没注意,最好是打包安装

在C:\Program Files\Microsoft Visual Studio 8\VC\redi
st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列文件:

msvcm80d.dll
msvcp80d.dll
msvcr80d.dll
Microsoft.VC80.DebugCRT.manifest

把这几个文件拷贝到目标机器上,与运行程序同一文件夹或放到system32下,就可以运行那个程序了。

方法二:
修改“C++/Code Generation”中的运行时库选项,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。

当然如果你也可以新建空项目,然后写C++程序,这

样也可以不需要framework

关于Visual C++ .net 在没有.net框架机器上运行的问题

8. visual studio编写的exe程序不能在没装vs的电脑上运行,怎么办啊?

其实有很多的解决办法呀,如下:(一般你看是具体什么提示然后,使用相应的提示到G.cn或百度找答案即可.....),下面的方法可参考使用...
1).在C:\Program Files\Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\x86   \Microsoft.VC80.DebugCRT 下找到了下列文件:
        msvcm80d.dll
        msvcp80d.dll
        msvcr80d.dll
        Microsoft.VC80.DebugCRT.manifest

   把这几个文件拷贝到目标机器上,与运行程序同一文件夹或放到system32下,就可以运行那个程序了。

    其他release版,MFC程序什么的都是拷redist下相应文件夹下的文件就可以了,文件夹后都有标识!

  2).修改编译选项,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不    再需要VC的dll了。
  
  3). 工程-》属性-》配置属性-》常规-》MFC的使用,选择"在静态库中使用mfc"
     这样生成的exe文件应该就可以在其他机器上跑了。

  4).在vc8安装盘上找到再分发包vcredist_xxx.exe和你的程序捆绑安装

  5).修改项目属性的编译开关 
      工程-->属性-->配置属性-->C/C++-->代码生成-->运行时库 修改为Multi-threaded(/MT)
    
   修改了Runtime类型以后,需要将MFC的编译类型也改成静态库
       工程-->属性-->配置属性-->常规-->MFC的使用  修改为:在静态库中使用MFC; 
          
   一部分情况下在这步就能解决问题,另外一部分情况会遇见如下情况,编译器报错:储如:"再次定义"
   解决方法如下:
   工程-->属性-->配置属性-->链接器-->输入-->附加依赖项 中加入相应的*.lib
        (如:加入nafxcw.lib,libcpmt.lib )这一般根据你程序所报的错进行修改;
   工程-->属性-->配置属性-->链接器-->输入-->特定的库
         (如:加入nafxcw.lib,libcpmt.lib )
     
   这样链接程序就不会先按照默认顺序来连接这两个库文件,而是在最后在加入对他们的引用. 

下面是一张可能发生冲突的列表 若要使用此运行时库 请忽略这些库 
  
单线程 (libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib   
多线程 (libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib   
使用 DLL 的多线程 (msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib   
调试单线程 (libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib   
调试多线程 (libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib   
使用 DLL 的调试多线程 (msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib