2017年6月13日火曜日

___iob_func リンクエラー

以前のプロジェクトを、VisualStudio 2015 で再構築すると、
Error LNK2019: unresolved external symbol ___iob_func referenced in function 
というエラーでビルドに失敗しました。

ちょいと調べてみたら VS2015より前のバージョンでは
#define stdin  (&__iob_func()[0])
#define stdout (&__iob_func()[1])
#define stderr (&__iob_func()[2])
が定義されていて

VS2015では#define stdin  (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))
と定義が異なっているためのエラーのようです。

そう、一部のライブラリについて古いバージョンでのビルドを利用してるわけです。
すべてのライブラリを VS2015 で再ビルドすればいいのですが、よそのプロジェクトだったりしてめんどくさい。

___iob_func はないので、つくっちまおう。ということで。
FILE _iob[] = {*stdin, *stdout, *stderr};

extern "C" FILE * __cdecl __iob_func(void)
{
    return _iob;
}

ってのを書いてビルドしたら動作するようになりました。
次にビルドするときのために記録しておこ。

参考
https://stackoverflow.com/questions/30412951/unresolved-external-symbol-imp-fprintf-and-imp-iob-func-sdl2

0 件のコメント:

コメントを投稿