VS 2015で解決:解析できない外部シンボル_imp___vsnprintfおよび_iob_func


1、解決:解決できない外部記号_imp___vsnprintf
vs 2015エンジニアリングオプションで、リンク追加依存項目にlegacy_を追加stdio_definitions.libでいいです.
この問題は、vs 2015のデフォルトコンパイル時に多くの標準ライブラリがインライン処理されるため、リンク可能な標準ライブラリファイルがないため、標準ライブラリ内の関数をリンクするために標準ライブラリファイルを追加する必要があるためです.
2、解決:解決できない外部記号_iob_func
VS 2015を使用してlibjpeg-turbo静的ライブラリを使用すると、コンパイルタイムズが間違っています.
error LNK2019:           __iob_func,       output_message     

キーワードに基づいてネット上でいくつかの文章を見つけて類似の誤りを説明したが、ほとんどは外部記号__iob が見つからない.なぜなら、VS 2010ではVC 6コンパイルDLLが使用されているからだ.私の場合とは違いますが、原理は同じです.私が出会ったこの問題の原因は、VS 2015でVS 2010を使用してコンパイルされた静的ライブラリです.私が使用しているlibjpeg-turbo静的ライブラリは公式サイトからコンパイルされたバージョンをダウンロードしているからです(vs 2010のようなバージョンでコンパイルされているはずです).
実は__iob_func __iob はいずれもstdin,stdout,stderrを定義するために使用されているが、異なるVCバージョンの実現方式は異なる.
以下はVS 2015のヘッダファイルcorecrt_wstdio.hにおけるstdin,stdout,stderrの定義である
ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);

#define stdin  (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))

元々VS 2015では__iob_func __acrt_iob_func に変更されていたので、『【LNK 2019】解析不能な外部記号__iob』という文章を参照して、自分のコードに__iob_func という変換関数を追加しました.
/*
 *  libjpeg-turbo vs2010   ,vs2015     libjpeg-turbo     :   __iob_func,
 *   __iob_func __acrt_iob_func          ,
 *  libjpeg-turbo vs2015   ,        
 */
#if _MSC_VER>=1900
#include "stdio.h" 
_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned); 
#ifdef __cplusplus 
extern "C" 
#endif 
FILE* __cdecl __iob_func(unsigned i) { 
    return __acrt_iob_func(i); 
}
#endif /* _MSC_VER>=1900 */

再コンパイルすると、エラーが消えます.