在Visual Studio中,确定第三方库或自己工程应该设置的CRT库选项的工具

前言

将glog编译了好多版本,用测试程序连接时,各种错。
看了一下,主要是要链接的glog库的crt库设置和测试工程的crt库设置不配套引起的问题。
做了一个工具,来解决库链接不匹配的问题。做了测试,非常好用。
如果由于crt库设置不配套引起的编译错误,直接看编译时打出的提示,选择正确的第三方库或修改自己工程的crt设置。

实验

// @file main.cpp
// @brief 
// <<在Visual Studio中,确定第三方库或自己工程应该设置的CRT库选项的工具>>
// 为了使链接第三方库时,确保第三方库的CRT选项和本工程的CRT选项配套, 做了一个工程内可用的校验工具
// 如果编译报错, 就可以重新选择正确crt版本的第三方库或调整自己工程的crt设置
// 这个想法, 没在其他资料上见过, 可以解决很多由于链接了不正确的第三方库引发的编译错误问题.
// 这个工具易用,只要包上my_verify_project_config.h就行

#include "pch.h"
#include <iostream>

#include <windows.h>

#include "my_verify_project_config.h"

int main(int argc, char** argv)
{
    return EXIT_SUCCESS;
}

// 编译阶段的IDE输出
/*
1>--------------------------------------------------------------------------------
1>>> 校验工程要连接的第三方库的CRT编译选项 - Visual Studio 2017
1>--------------------------------------------------------------------------------
1>操作系统是windows
1>IDE是vs2017
1>IDE字符集是MBCS
1>工程配置 = Debug
1>工程将要编译为Win32
1>_DLL被设置
1>要链接的第三方库的CRT库设置应该为/MDd
1>--------------------------------------------------------------------------------
1><< 校验工程要连接的第三方库的CRT编译选项 - Visual Studio 2017
1>--------------------------------------------------------------------------------
*/
// @file my_verify_project_config.h
// @ref 
//      <<MS预定义宏的资料>> 
//      https://msdn.microsoft.com/en-us/library/b0084kay.aspx
//      https://docs.microsoft.com/en-us/cpp/preprocessor/c-cpp-preprocessor-reference?view=vs-2017
//      https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2017
//      https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/2kzt1wy3(v=vs.110)
//      https://github.com/prepare/Espresso/wiki/04:-Visual-Studio--MD,--MT,--LD-(Use-Run-Time-Library)

#if !defined(__MY_VERIFY_PROJECT_CONFIG_H__)
#define __MY_VERIFY_PROJECT_CONFIG_H__

// LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”
// debug版引用了release版的库,或者debug版本身使用的crt库不是MXd

// LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”
// release版引用了debug版的库,或者release版本身使用的crt库不是MX

// 一个静态库即使是debug版,如果选用了MX选项,生成的静态库还是release版

#pragma message("--------------------------------------------------------------------------------")
#pragma message(">> 校验工程要连接的第三方库的CRT编译选项 - Visual Studio 2017")
#pragma message("--------------------------------------------------------------------------------")

// --------------------------------------------------------------------------------
#define OS_IS_WIN (defined _WIN32)
// --------------------------------------------------------------------------------

#if defined(OS_IS_WIN)
#pragma message("操作系统是windows")
#else 
#error 操作系统不是windows
#endif

// --------------------------------------------------------------------------------
#define VS_IDE_VER_2017 1910 // vs2017 >= 1910
#define IDE_IS_VS2017 ((defined _MSC_VER) && (_MSC_VER >= VS_IDE_VER_2017)) // if cur vs is vs2017
// --------------------------------------------------------------------------------
#if IDE_IS_VS2017
#pragma message("IDE是vs2017")
#else
#error IDE不是vs2017
#endif

// --------------------------------------------------------------------------------
#define PRJ_MBCS (defined _MBCS)
#define PRJ_UNICODE (defined _UNICODE)
// --------------------------------------------------------------------------------
#if PRJ_MBCS
#pragma message("IDE字符集是MBCS")
#elif PRJ_UNICODE
#pragma message("IDE字符集是UNICODE")
#else
#error IDE字符集未知, 只能是MBCS或UNICODE!
#endif

// --------------------------------------------------------------------------------
#define PRJ_DEBUG (!defined NDEBUG)
#define PRJ_RELEASE (defined NDEBUG)
// --------------------------------------------------------------------------------
#if PRJ_DEBUG
#pragma message("工程配置 = Debug")
#elif PRJ_RELEASE
#pragma message("工程配置 = Release")
#else
#error 工程配置未知, 只能是Debug或Release!
#endif

// --------------------------------------------------------------------------------
#define BUILD_AS_WIN32 (defined _M_IX86)
#define BUILD_AS_WIN64 (defined _M_AMD64)
// --------------------------------------------------------------------------------
#if BUILD_AS_WIN32
#pragma message("工程将要编译为Win32")
#elif BUILD_AS_WIN64
#pragma message("工程将要编译为Win64")
#else
#error 目标平台未知, 只能为Win32或Win64
#endif

// --------------------------------------------------------------------------------
// 校验_DLL是否已经设置
// --------------------------------------------------------------------------------
#if (defined _DLL)
// /MD, /MDd会设置_DLL
// /MT, /MTd 不会设置_DLL
#pragma message("_DLL被设置")
#endif

// --------------------------------------------------------------------------------
#define CRT_LIB_NEED_LINK_TO_MT (PRJ_RELEASE && (!defined _DLL) && (defined _MT)) // 多线程
#define CRT_LIB_NEED_LINK_TO_MTd (PRJ_DEBUG && (!defined _DLL) && (defined _MT)) // 多线程调试
#define CRT_LIB_NEED_LINK_TO_MD (PRJ_RELEASE && (defined _DLL) && (defined _MT)) // 多线程DLL
#define CRT_LIB_NEED_LINK_TO_MDd (PRJ_DEBUG && (defined _DLL) && (defined _MT)) // 多线程调试DLL
// --------------------------------------------------------------------------------
// 这里的判断说明本工程连接其他第三方时的库版本类型,如果不是预期的库类型, 连接就会报错
#if (CRT_LIB_NEED_LINK_TO_MT)
#pragma message("要链接的第三方库的CRT库设置应该为/MT")
#elif (CRT_LIB_NEED_LINK_TO_MTd)
#pragma message("要链接的第三方库的CRT库设置应该为/MTd")
#elif (CRT_LIB_NEED_LINK_TO_MD)
#pragma message("要链接的第三方库的CRT库设置应该为/MD")
#elif (CRT_LIB_NEED_LINK_TO_MDd)
#pragma message("要链接的第三方库的CRT库设置应该为/MDd")
#endif

// 对当前工程使用CRT库的情况进行校验, Release下只能是MT,MD; Debug下只能是MTd, MDd
#if (PRJ_DEBUG) && (!CRT_LIB_NEED_LINK_TO_MTd && !CRT_LIB_NEED_LINK_TO_MDd)
#error Debug下只能链接到/MTd或/MDd !
#elif (PRJ_RELEASE) && (!CRT_LIB_NEED_LINK_TO_MT && !CRT_LIB_NEED_LINK_TO_MD)
#error Release下只能链接到/MT或/MD !
#endif

#pragma message("--------------------------------------------------------------------------------")
#pragma message("<< 校验工程要连接的第三方库的CRT编译选项 - Visual Studio 2017")
#pragma message("--------------------------------------------------------------------------------")

#endif // #if !defined(__MY_VERIFY_PROJECT_CONFIG_H__)

猜你喜欢

转载自blog.csdn.net/LostSpeed/article/details/82530513
今日推荐