VS 2015で解決:解析できない外部シンボル_imp___vsnprintfおよび_iob_func
1996 ワード
1、解決:解決できない外部記号_imp___vsnprintf
vs 2015エンジニアリングオプションで、リンク追加依存項目にlegacy_を追加stdio_definitions.libでいいです.
この問題は、vs 2015のデフォルトコンパイル時に多くの標準ライブラリがインライン処理されるため、リンク可能な標準ライブラリファイルがないため、標準ライブラリ内の関数をリンクするために標準ライブラリファイルを追加する必要があるためです.
2、解決:解決できない外部記号_iob_func
VS 2015を使用してlibjpeg-turbo静的ライブラリを使用すると、コンパイルタイムズが間違っています.
キーワードに基づいてネット上でいくつかの文章を見つけて類似の誤りを説明したが、ほとんどは外部記号
実は
以下はVS 2015のヘッダファイル
元々VS 2015では
再コンパイルすると、エラーが消えます.
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 */
再コンパイルすると、エラーが消えます.