How to link with the correct C Run-Time (CRT) library
2006-06-02 21:59
435 查看
There are six types of reusable libraries:
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.
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.
• | Static Single Threaded Library (Debug/Release) |
• | Static Multithreaded Library (Debug/Release) |
• | Dynamic Link Library (DLL)(Debug/Release) |
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 _DLLYou can view an object module to determine which switch was used when it was built by using this command:
dumpbin /all <object>.objLook in the section titled RAW DATA #1. In the right-most column, the default libraries will be listed.
Back to the top |
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. |
Back to the top |
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
Back to the top |
相关文章推荐
- How to link with the correct C Run-Time (CRT) library
- How to call webservices with ASP.NET at Run time?
- [Yii Framework] How to run cron job (or use command) in the server with yii framework
- How to find the correct version of JDeveloper to use with eBusiness Suite 11i or Release 12.x
- How To Use the C Run-Time
- When the C Run-Time (CRT) library and Microsoft Foundation Class (MFC) libraries are linked in the w
- How to Use the Dynamic Link Library in C++ Linux (C++调用Delphi写的.so文件)
- How to solve the problem "A project with an Output Type of Class Library cannot be started directly "
- How to solve problem caused when the CRT library and MFC libraries are linked in the wrong order
- How to Render the Hyperlink with Braces
- How to call Visual Basic .NET run-time library members from Visual C#
- How to Run a Root “/” Site with the VS/VWD 2005 Local Web Server
- OpenCV_Tutorials——CORE MODULE.THE CORE FUNCTIONALITY—— How to scan images, lookup tables and time measurement with OpenCV
- How to get the control inside the ControlTemplate/DataTemplate on run time.
- Tip/Trick: How to Run a Root “/” Site with the Local Web Server using VS 2005 SP1
- OA Framework - How to Find the Correct Version of JDeveloper to Use with E-Business Suite 11i or Release 12.x (Doc ID 416708.1)
- How to find the correct version of JDeveloper to use with eBusiness Suite 11i or Release 12.x
- cannot find the flags to link with Boost date_time 错误修复
- A child is running up a staircase with N steps, and can hop either 1 step,2steps,3 steps at a time. Count how many possible ways the child can run up
- How to run the multiple tests with different weight Groovy way