VC PlusPlus:Link Error LINK2019 未解決のシンボル…で参照されました。 対処方法のソースを表示
新しいページはコチラ
移動:
案内
,
検索
[[VC PlusPlus]]に戻る == '''概要''' == Visual Studioを使うプログラマなら、一度は目にするエラーです。他人が作ったプロジェクトとか複雑なプロジェクトになれば、その遭遇率は高くなります。 これは、基本的にあなたの落ち度ではない事が多いのです。落胆しないで! 対処方法はいくつかのパターンに分かれています。解決が困難なモノもあります。他人のやることなのでね。簡単な対処方法が提供されていないとかあるよ。それでも乗り越えて行く力(チカラ)はあった方がいい。いかなる場合でも冷静に全ての整合性をとるということは、有能なプログラマである証拠だ。 簡単ではないいくつかのパターンについて、ココで一緒に考えていきましょう。 === ''' 知っていた方が良い小技 ''' === Libファイルに目的の関数が格納されているかを確認する方法があるので、この方法を知っておいた方が良いでしょう。 以下のようなコマンドを使います <syntaxhighlight2 lang="bash"> dumpbin.exe /LINKERMEMBER (ライブラリファイル名or(完全パスor相対パス)\ライブラリファイル名) </syntaxhighlight2> dumbinは、C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\Hostx86\x86のようなパスの元にあるものが使われます。このようなコマンドを使う場合は、VisualStudioのメニュー[ツール]-[コマンドライン]-[開発者用PowerShell]から起動すると、パスがとおった状態のPowerShellのコマンドプロンプトが立ち上がります。このようにして起動した場合は単にdumpbinとするだけでコマンドが使えます。 上記コマンドで、Libファイルに格納される関数名が一覧できます。 === ''' 対処方法 ''' === '''1.安全ではない古い関数が使われるパターン''' scanf, printf, strlen, strcmpといったC言語の基本とも言える関数を使ったときに発生します。昨今ではオーバーフローしないような、より安全な関数を使うのが定説になっていますが、勉強のため、ためしにgccとか古いVisual Studioで主に開発しているプログラマからプログラムをもらってきたときとかに発生します。古い関数自体は新しいVisual Studioでもコンパイルできるので、関数は新たにobjファイル化することが出来て問題なく使えます。これがlibファイル化された中で呼び出して、使われている場合です。この場合、他のlibファイルの中で古い関数が提供されている必要があり、リンカ設定をしておかないと駄目です。Visual Studioで最初から設定されているリンカ設定されているlibファイルからは、古い関数が消えています。つまり、参照先が無い。リンクエラーだよ。ってなります。なんで、こんな嫌がらせするのか?と思ってしまいますが、Micorsoftは昔ながらの関数群を標準ヘッダファイルでインライン定義(ヘッダファイルの中に関数の定義をして、ついでにプログラムの内容までヘッダファイルに記述する方法です)して内部で持たせるように変更したかったようです。libファイルによる外部ファイル参照を必要としない方法で扱いたかったんすかね。ナカナカ思い切った互換性を保たない変更です。 プログラマを悩ませる変更をするなんて、アホかと馬鹿かと、愚痴ってもしょうがないです。こういう変更に敏感に対応できてこそプログラマたるプログラマなのだと突き進むしかないのです。 メンドクサイ対応方法としては、入手したlibのソースファイルがあれば、それを入手してすべての関数をscanf_sのような最新のMSVC(MicrosoftVisualCpp)の標準libで提供されている関数を使ってlibファイルを再構築するのがいいのですが、scanf_sに変えて、受け取る文字列のサイズを調整するという作業をすべての基本関数に対して施術しなくてはなりません。それが割かし膨大なプロジェクトである場合、とてもじゃないけど、修正しきれないし、どんなに有能なプログラマでも何度も繰り返して同じことをやるだけにしても、どこかでミスタイプや、計算間違えでバグを起こす原因にもなります。それにそもそもソースが提供されている場合に限ります。 そんな時は旧型対応のライブラリを使いましょう。 *旧型のライブラリを使用して解決! :対処したいプロジェクトをアクティブにした状態で、メニューの[プロジェクト]-[プロパティ]を選択して表示されるダイアログで[構成プロパティ]-[リンカ]-[入力]の[追加の依存ファイル]に ::'''legacy_stdio_definitions.lib''' :を追加します。なんだ、あるんじゃん。古い関数が使われたら、自動的にリンクしろよ。って思ったりもします。でも、本当に古い関数をそのまま使うかはプログラマ側で判断すべし!とMicrosoftは言っています。 続きはまた気が向いたら書くので記事は増えていく予定。 [[VC PlusPlus]]に戻る
VC PlusPlus:Link Error LINK2019 未解決のシンボル…で参照されました。 対処方法
に戻る。
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ