How to link with the correct C Run-Time (CRT) library

原创 2006年06月02日 21:59:00
There are six types of reusable libraries:
Static Single Threaded Library (Debug/Release)
Static Multithreaded Library (Debug/Release)
Dynamic Link Library (DLL)(Debug/Release)
Note Each library has a debug version and a release version.

The DLL is multithread-safe and a single-thread version of the CRT library is not provided for DLLs. If the reusable library or any user of the library is using multiple threads, then the library needs to be a multithread-safe library type.

Note Debug libraries and compiler switches /MLd, /MTd, and /MDd are only available in Visual C++ versions 4.0 and later.

The following table shows which compiler switch should be used for building each of the six types of reusable libraries (all DLL types are multithread-safe). Any project that uses the reusable library should use the same compiler switch. When using the /ML(default), /MLd, /MT, /MTd, /MD, or /MDd compiler switches, the compiler places the default library name (listed under the Library column) in the object file.
Reusable Library            Switch    Library    Macro(s) Defined
----------------------------------------------------------------
Single Threaded             /ML       LIBC       (none)
Static MultiThread          /MT       LIBCMT     _MT
Dynamic Link (DLL)          /MD       MSVCRT     _MT and _DLL
Debug Single Threaded       /MLd      LIBCD      _DEBUG
Debug Static MultiThread    /MTd      LIBCMTD    _DEBUG and _MT
Debug Dynamic Link (DLL)    /MDd      MSVCRTD    _DEBUG, _MT, and _DLL
				
You can view an object module to determine which switch was used when it was built by using this command:
   dumpbin /all <object>.obj
				
Look in the section titled RAW DATA #1. In the right-most column, the default libraries will be listed.

MORE INFORMATION

A reusable library and all of its users should use the same CRT library types and therefore the same compiler switch. The macros defined (or not defined) for each of the compiler switches can be used in the header file(s) of your reusable library to enforce the proper compiler switch. The sample code in this article demonstrates how to use these macros.

If you would like users of the library to be able to choose static or DLL CRT, you should provide both static and DLL reusable library types.

If you do choose to mix CRT libraries, remember that you have two separate copies of the CRT, with separate and distinct states, so you must be careful about what you try to do across a CRT-boundary. There are many ways to get into trouble with two CRTs. Here are just a few:
There are two separate heaps. You cannot allocate (explicitly with new, malloc, or so on -- or implicitly with strdup, strstreambuf::str, or so on), and then pass the pointer across a CRT-boundary to be freed.
You cannot pass a FILE* or file handle across a CRT-boundary and expect the "stdio low-level IO" to work.
You cannot set the locale in one and expect the other's locale to be set.
Beginning with Visual C++ 4.0, the linker will issue a warning (LNK4098) if a resulting module attempts to combine more than one copy of the CRT library. For more information, search the Help file for LNK4098.

Sample code

The following code can be used in the reusable library's header file to ensure the consistent use of the correct compiler switch:
// MyReusableStaticSingleThreadReleaseLibrary.h
#if defined(_MT) || defined(_DEBUG)
    #error The /ML compiler switch is required.
#endif

// MyReusableStaticMultithreadReleaseLibrary.h
#if !defined(_MT) || defined(_DLL) || defined(_DEBUG)
    #error The /MT compiler switch is required.
#endif

// MyReusableDynamicLinkReleaseLibrary.h
#if !defined(_MT) || !defined(_DLL) || defined(_DEBUG)
    #error The /MD compiler switch is required.
#endif

// MyReusableStaticSingleThreadDebugLibrary.h
#if defined(_MT) || !defined(_DEBUG)
    #error The /MLd compiler switch is required.
#endif

// MyReusableStaticMultithreadDebugLibrary.h
#if !defined(_MT) || defined(_DLL) || !defined(_DEBUG)
    #error The /MTd compiler switch is required.
#endif

// MyReusableDynamicLinkDebugLibrary.h
#if !defined(_MT) || !defined(_DLL) || !defined(_DEBUG)
    #error The /MDd compiler switch is required.
#endif
				

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

链接时如何选择C Run-Time(CRT) library

在Windows下有六种类型CRTLib(C运行库): Reusable Library                Switch &#...

C运行时库CRT(C Run-time Library)详解

一、什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

C运行时库CRT(C Run-time Library)详解

一、什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语...

解决CRT(即C Run-Time)中函数的安全警告

解决CRT(即C Run-Time)中函数的安全警告 参考MSDN 1、Security Features in the CRT 2、Secure Template Overloads 是不是...

如何理解C run-time library

如何理解C run-time library (C运行时库) 注: 以下内容部分引自CSND中相关讨论的帖子,并结合自己的理解整理而成。仅供参考。 1)运行时库就是 C run-tim...

C run-time library

crt是系统运行的基础,包含了c常用的函数集,为运行main做了初始化环境变量、堆、io等资源,并在结束后清理。 Windows环境下,VC提供的 C run-time library又分为动态运行...

如何理解C run-time library (C运行时库)

注:以下内容部分引自CSND中相关讨论的帖子,并结合自己的理解整理而成。仅供参考。 1)运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因...

如何理解C run-time library(C运行时库)

1 )运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数.  2)C 语言是所谓的“小内核”语言,...

C运行时库(C Run-time Library)详解

一、什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语...

C运行时库(C Run-time Library)详解

一、什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语言是所谓...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)