Visual C ++:特定のリンカー警告を無効にする方法?


118

私はCGALのライブラリを使用しています。これは、コードコンパイルのリンク段階で、次の形式の多くのリンク警告を生成します。

warning LNK4099: PDB 'vc80.pdb' was not found with 'gmp-vc80-mt-sgd.lib' or at 'vc80.pdb'; linking object as if no debug info

Visual C ++ / Studio 2008でこの特定のリンカー警告をオフにするにはどうすればよいですか?

私が使用している外部(CGAL)ライブラリを制御できないことに注意してください。外部ライブラリを再コンパイルすることはできません。したがって、私の側でメッセージを修正する必要があります。


1
VS2005の場合、/ ignore:4099は正常に機能します。

/ ignore:4099はVS2008で正常に機能します。
トム

/ignore:4099Visual Studio 10とC ++で正常に動作します。私は警告を受け、LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)なんとかこの方法でそれを削除しました。
Manolete


3
VS2013は/ ignore:4099を受け入れます:)
mlvljr 2015年

回答:


101

追加のリンカーオプションとして次を追加します。

 /ignore:4099

これは、プロパティ->リンカー->コマンドラインにあります。


5
/ ignoreは存在しないと思います。エラーは引き続きリストされ、/ ignoreはMSDNに記載されていません。「LNK4075の警告: '/ INCREMENTAL:NO'の指定により '/ EDITANDCONTINUE'を無視する」ために4075を無効にしようとしています
Nick Desjardins 2010年

1
/ IGNOREは文書化されていませんが、利用できます。connect.microsoft.com/VisualStudio/feedback/details/176188/…を
アーロンサーレラ


7
/ ignore:4099をリンカーフラグとして使用できますが、注意点があります。残念ながら、Microsoftは4099を無視できない警告にすることを決定したため、link.exeにパッチを適用する必要があります。ちょっとクレイジーに聞こえますが、他に方法はありません。詳細はこちら:bottledlight.com/docs/lnk4099.html HxD を16進エディターとして使用し、そのページの説明に従ってVS10で正常に動作しました。注文はまだ4088、4099、4105です
アンドレアスHaferburg

2
VS 2015で動作します(プロジェクトはVS2013ツールセットを使用していますが、違いがあるかどうかは不明です)
Assimilater

50

2018-10-16の更新

伝えられるところによると、VS 2013の時点で、この警告は無効にできます。@Mark Ransomのコメントを参照してください。

元の回答

その特定の警告を無効にすることはできません。

による Geoff Chappellに、4099警告は/ wxと組み合わせて使用​​しても無視することが重要であるかのように扱われます(警告をエラーとして扱い、他の状況では指定された警告を無視します)。

リンクからの関連テキストは次のとおりです。

無視できない警告

一部の警告番号では、/ ignoreオプションの指定は受け入れられますが、必ずしも影響を受けるわけではありません。/ wxオプションがアクティブでないときに警告が発生しても、警告メッセージは表示されますが、/ wxオプションがアクティブな場合、警告は無視されます。これは、警告を無視する試みを無効にするほど重要であると考えられているかのようですが、ユーザーが無視されていない警告の価格を高くしすぎている場合はそうではありません。

次の警告番号が影響を受けます。

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237

彼は「4099年の警告は無視するには重要すぎる」とは述べていない。彼はそれがオフにできないという事実からこれを推測します。(そのリンクには追加情報がないため、ここに記載されています。)
Ben M

あなたの懸念に対処するために更新されました@BenM
John Weldon

1
この回答は古く、VS2017で警告4099を無効にするとうまくいきました。ここのコメントから、おそらくVS2013以降では無効にできると思われます。
Mark Ransom

10

(記録のため、およびスレッドがmsdnフォーラムで消える前に)無効にできない警告のリストにあるため(少なくともVS2010では)警告を無効にすることはできません(/ wd4099は機能しません)ただし、代わりにパッチlink.exe(通常はC:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe)を使用して、リストから削除することができます。削岩機のような音、私は知っています。それでもうまくいきます。

たとえば、4099の警告を削除する場合は、16進エディターでlink.exeを開き、15A0の行に移動して03 10(4099のリトルエンディアン)を読み取り、FF 00(存在しない)に置き換えます。


5
F8 0F 00 00-03 10 00 00-09 10 00 00(リトルエンディアンの32ビットダブルワードとしての4088、4099、4105)のシーケンスを探しているはずです。amd64 / link.exeでも同じです。
Andreas Haferburg 2013

8

他の人の利益のために、私は私がしたことを含めますが。

Visual Studio(私の場合は2010)でLNK4204の警告を無視することはできないので、私のアプローチは、必要なもの(pdbファイル)を与えることでした。私の場合はオープンソースライブラリを使用していたので、pdbファイルをビルドするコードが既にあります。

ただし、デフォルトでは、すべてのPDFファイルに同じ名前を付けます。私の場合はvc100.pdbです。.libごとに.pdbが必要になるため、特に、約20の静的.libファイルを作成するImageMagikのようなものを使用している場合、これにより問題が発生します。1つのディレクトリに20個のlibファイル(アプリケーションのリンカーがライブラリをリンクするために参照する)を含めることはできず、20個すべての.pdbファイルを同じものと呼ぶことはできません。

私の解決策は、静的ライブラリファイルを移動して再構築し、プロジェクトに関して.pdbファイルに名前を付けるようにVS2010を構成することでした。このように、各.libは同様の名前の.pdbを取得し、プロジェクトで使用する1つのディレクトリにすべてのLIBとPDBを配置できます。

「デバッグ」構成のために、私は編集しました:

プロパティ->構成プロパティ-> C / C ++->出力ファイル->プログラムデータベースファイル名から

$(IntDir)vc $(PlatformToolsetVersion).pdb

次の値になるように:

$(OutDir)vc $(PlatformToolsetVersion)D $(ProjectName).pdb

これで、中間ディレクトリのどこかではなく、.pdbファイルが出力ディレクトリに書き込まれ、そこに.libファイルも書き込まれます。最も重要なのは、D + プロジェクト名のサフィックスで名前が付けられることです。つまり、各ライブラリプロジェクト、プロジェクト.libとプロジェクト固有の.pdbを生成します。

すべてのリリース.libファイル、デバッグ.libファイル、およびデバッグ.pdbファイルを開発システムの1か所にコピーできるようになりました。そのサードパーティライブラリをデバッグモードで使用するプロジェクトには、pdbがあります。デバッグモードで必要なファイル。


2
私はこれがあると言うだろう質問への答え。多くの回答に含まれているリンカーのパッチングの提案は、アシニンです。マイクロソフトがこの警告を無視できないものにすることについて「間違っている」としても。
タマシュSzelei

3
これは、ライブラリをソースからコンパイルする場合の正しい答えです。ただし、一部のプログラムは、.pdbファイルを含まない商用ライブラリに依存しているため、それらの.pdbファイルを生成することはできません。
ブライスワーグナー

3

/ ignoreはVC6 link.exeオプションだと思います。VS2005およびVS2008のリンカーの場合、文書化された/ ignoreオプションはありませんが、リンカーは "/ ignore:XXX"オプションを無視するだけで、エラーも効果もありません。


2
無視フラグがVC6後に無効になっていたので、実際には、リンカの警告を無視しないenouragedだ:bytes.com/topic/net/answers/...
Gyuri

/ ignoreは、VS2013で再び使用できます。
フェルナンドゴンザレスサンチェス

1

PDBファイルは通常、デバッグ情報を格納するために使用されます。この警告はvc80.pdb、ターゲットオブジェクトファイルをリンクするときにファイルが見つからないことが原因と考えられます。LNK4099に関するMSDNのエントリをこちらでお読みください

または、プロジェクトプロパティ>リンカー>デバッグ>デバッグ情報の生成フィールドからデバッグ情報の生成をオフにすることもできます。


3
デバッグ情報をオフにすると、リンカーの警告は解決されますが、ブレークポイントはデバッグ情報なしでは機能しません。それは私にはあまり役に立ちません。
Ashwin Nanjappa

2
警告をオフにすることは決して正しいことではありません。それらを修正します。pdbを見つけて、適切な場所にコピーされることを確認する必要があります。
2009年

ため息、それは本当です!悲しいことに、この場合、そのpdbが見つかりません。
Ashwin Nanjappa

1
vc80.pdbは、vc8のデフォルトのpdb名です。この警告は、CGALライブラリで利用できるデバッグ情報がないことを意味します。無視しても安全です。
JoeG

1

編集:vc80 / Visual Studio 2005ではなく、Visual Studio 2008 / vc90バージョンのCGALライブラリを使用します(おそらくここから )。

リンカーツールの警告LNK4099

/ Z7を使用してコンパイルすることもできるため、pdbを使用する必要はありません。または、リンクしているオブジェクトの.pdbファイルがない場合は、/ DEBUGリンカーオプションを削除します。


2
ありがとう。/ Z7でコンパイルすると、CGALライブラリの.pdbファイルが要求されます。/ DEBUGはリンカーの警告を解決しますが、デバッグ情報がないとブレークポイントは機能しません。
Ashwin Nanjappa

1

@John Weldonが言ったように、リンカー警告4099を無効にすることはできません。

プロジェクト構成を変更してライブラリを再構築する必要があります。いくつかのオプションがあります。

  • デバッグ情報を含むPDBファイルの保存は、.libファイルを保存するフォルダーと同じです。値 "$(OutDir)$(TargetName).pdb"をプロパティ-> C / C ++->出力ファイル-プログラムデータベースファイル名に設定します
  • デバッグ情報を.libファイルに保存します。値「C7互換(/ Z7)」を「プロパティ」->「C / C ++」->「一般」->「デバッグ情報フォ​​ーマット」に設定します。
  • このライブラリの生成デバッグ情報を無効にします。プロパティ-> C / C ++->一般->デバッグ情報フォ​​ーマットから値を削除します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.