ページ 11

外部シンボル"_errno"は未解決です

Posted: 2013年12月23日(月) 22:44
by channtaku
C言語を用いてプログラムを書いています。
コンパイラはvisual studio2010を用いていて、そのときは問題なくコンパイルできていました。
ところが、visual studioを2012にアップロードすると、
未解決の外部シンボル__report_rangecheckfailureが~で参照されました
というエラーがでました。そのとき、ライブラリファイルとして、user32.lib、gc.lib、libcd.libをリンクしていたのですが、
いろいろ調べていたところ__report_rangecheckfailureはmsvcrtd.libの中にあるとわかったので、上記のライブラリファイルに加えて
msvcrt.libをリンクに追加しました。
すると、

msvcrt.lib(gs_cookie.obj) : error LNK2005: ___security_cookie は既に libcd.lib(s
eccook.obj) で定義されています。

というエラーがでました。
なので、libcd.libを/nodefaultlibを用いて参照しないようにすると

gc.lib(malloc.obj) : error LNK2001: 外部シンボル "_errno" は未解決です。

というエラーがでました。
おそらくライブラリファイルの呼び出しの部分でうまくいっていないと思うのですがなかなか本質的な解決にはいたっていません。
なにか解決法があればご教授願いたいと思います。

ちなみにC言語については初心者レベルです。

Re: 外部シンボル"_errno"は未解決です

Posted: 2013年12月23日(月) 22:47
by みけCAT
過去ログです。
LNK2019:未解決の外部シンボル__report_rangecheckfailure • C言語交流フォーラム ~ mixC++ ~

「Project → Upgrade VC++ projects…」というメニューでプロジェクトをVS2012のものにアップグレードするといいらしいです。

Re: 外部シンボル"_errno"は未解決です

Posted: 2013年12月23日(月) 23:02
by naohiro19
リビルドを実行するとうまくいくかもしれません。

Re: 外部シンボル"_errno"は未解決です

Posted: 2013年12月23日(月) 23:18
by channtaku
「Project → Upgrade VC++ projects…」というメニューでプロジェクトをVS2012のものにアップグレードするといいらしいです。[/quote]

プロジェクト等は使ってないんですけどね・・・
visual studioのコマンドプロンプトでコンパイルをしているだけで・・・

私自身の理解が浅いだけかもしれませんが。

Re: 外部シンボル"_errno"は未解決です

Posted: 2013年12月23日(月) 23:24
by みけCAT
では/GS-オプションを試してみてください。

Re: 外部シンボル"_errno"は未解決です

Posted: 2013年12月23日(月) 23:32
by channtaku
みけCAT さんが書きました:では/GS-オプションを試してみてください。
それも考えて、いろいろ試してみたのですがなかなかうまくいきません。
いろいろ調べていたところ
「異なるバージョンのコンパイラで作ったライブラリをリンクさせようとすると、コンパイラが勝手にコードを埋め込む」
というのを見て、おそらくこれと同じようなことが起こっているのでは?と思うのですが・・・

オフにするとは具体的にどうするかおわかりでしょうか?
プロジェクト→プロパティ→C/C++→コード生成→セキュリティチェックといってオフにすることはできるのはわかるのですが、
プロジェクトを使っているわけじゃないので、この操作もできないのです・・・

Re: 外部シンボル"_errno"は未解決です

Posted: 2013年12月24日(火) 00:45
by へにっくす
channtaku さんが書きました:オフにするとは具体的にどうするかおわかりでしょうか?
プロジェクト→プロパティ→C/C++→コード生成→セキュリティチェックといってオフにすることはできるのはわかるのですが、
プロジェクトを使っているわけじゃないので、この操作もできないのです・・・
コマンドラインを使ってビルドしてるのではないのですか。
してるのであれば、そのコマンドラインの内容を示さないと、具体的な指摘はできないと思いますよ。
単純に
cl <ファイル名>.c user.lib gc.lib libcd.lib
とかしてるだけ?

Re: 外部シンボル"_errno"は未解決です

Posted: 2013年12月24日(火) 00:52
by channtaku
バッチファイルを用いて順次実行していくプログラムにしています。
エラーが出ているバッチファイルの中身は以下のとおりです。

cd 4_MP
cl /c Feeddown_v2.c
link /nodefaultlib:libcmt /nodefaultlib:libc /nodefaultlib:libcd Feeddown_v2.obj sub_files/split.obj sub_files/user32.lib sub_files/gc.lib sub_files/msvcrtd.lib
Feeddown_v2.exe
cd ..

4_MPのフォルダにFeeddown_v2.cが、4_MP\sub_filesにライブラリファイル等が入っています。
今は、gc.libのところで外部シンボル"_errno"は未解決ですというエラーが出ています。
3行目のライブラリファイルをいろいろいじっているのですが、なかなかうまくいきません・・・

Re: 外部シンボル"_errno"は未解決です

Posted: 2013年12月24日(火) 01:11
by へにっくす
まだ足りないですね。
コマンドプロンプトで、環境変数を知るために、setを実行した結果を貼ってください。
ちなみに、みけCATさんが書いた、/GS-というのは、clのオプションです。
セキュリティチェックをオフにするという意味です。
オプションの説明などは、単純にcl /?を実行すると出てきますよ。

Re: 外部シンボル"_errno"は未解決です

Posted: 2013年12月24日(火) 02:06
by channtaku
cd 4_MP
cl /c Feeddown_v2.c
link /nodefaultlib:libcmt /nodefaultlib:libc Feeddown_v2.obj sub_files/split.obj sub_files/user32.lib sub_files/gc.lib sub_files/libcd.lib
Feeddown_v2.exe
cd ..

の2行目をcl /GS- /c Feeddown_v2.cとすることで解決できました!
ヘニックスさん、みけCHATさん、本当にありがとうございました!