2017-07-07 6 views
1

私たちが作成したが一般的に行うサードパーティのソフトウェアではなく、は何らかの奇妙な動作をします:静的なlibとしてビルドされているため、作成するPDBファイルはvc.pdbと呼ばれ、中間フォルダ。これで、約12のpdbファイルが作成されます。これらのファイルはすべて異なるフォルダにあり、すべてが異なるライブラリと異なる設定の同じ名前を持ちます。ビジュアルスタジオで使用可能なツールでpdbファイルの名前を変更しますか?

私たちのコードにこのサードパーティのソフトウェアを統合すると、pdbの焼き付けられたパスが明らかにすべてのマシンに存在しないので、LNK4099の警告が表示されます。サードパーティのソフトウェアが1つの出力ディレクトリに複数の.libファイルを生成するため、vc < ...> .pdbファイルを一緒に配置することはできません。

私は私のコントロール下にあるものにpdb名で焼いたlibファイルにパッチを当てる方法を探しています。 Visual Studioビルドツールはこれを行う方法を提供していますか?

編集:私たちは何をしているのか詳しく説明しましょう: 私たちは、私たちのプロジェクトにいくつかのサードパーティの静的なlibを統合することに決めました。プロジェクト自体はソースパッケージとして提供されます。ある開発者またはビルドサーバー、またはさまざまなビルド構成でa.libおよびb.libという静的にリンクされたlibsを生成するこのソースパッケージを作成する人。それらを使用すると、デフォルトのビジュアルスタジオ構成ではvc110.pdbファイルが生成されます。これは、すべて同じVSが自動的に$(IntDir)に配置されるためです。だから、pdbファイルはどこにでもあります。 これらのサードパーティのバイナリを、指定したプロジェクトXのVCSにコミットします。 プロジェクトXで静的ライブラリを使用する人は、最終バイナリにリンクする必要があります。これは、pdbファイルがVCSになく、このマシンでは使用できないため、LNK4099が生成される時刻です。

しかし、実際にはvc110.pdbファイルをすべてコミットすることはできません。なぜなら、これは役に立たないからです。完全修飾パスは静的ライブラリに組み込まれているため、他のユーザはそれを複製することができません。リンク中にPDBへのフルパスが見つからないため、libファイルの場所にvc110.pdbがあります。 サードパーティのパッケージはa.libとb.libを同じディレクトリに置くことにしたので、サードパーティパッケージのビルドを変更してvcxprojのpdbファイルの名前を変更しない限り、pdbファイルを適切に配置することはできませんlibsの世代を別々のディレクトリ(vcxprojでも可能)に分割することができます。

サードパーティのビルドファイルをいつでも変更することができます。私はこのサードパーティ製のパッケージのプレーンな新鮮なダウンロードを使用して、いくつかの "シンプルな "バッチスクリプトです。 このパッケージのデフォルトの結果は以下のとおりです。

/Bin 
    /Debug 
     a.lib 
     b.lib 
    /Release 
     a.lib 
     b.lib 
/Temp 
    /A 
     /Debug 
      vc110.pdb 
     /Release 
      vc110.pdb 
    /B 
     /Debug 
      vc110.pdb 
     /Release 
      vc110.pdb 

私が本当に欲しいのはビルド後に生成されたファイルにパッチを適用することです。 私の「シンプルな」バッチ(または何でも)のスクリプトでは、pdbファイルの名前をa.pdbとb.pdbに変更することができます。これはリンカがvc110.pdbをコンパイル済みのままであるため、名前で。そのため、私はlibやdumpbinなどのツールを使って、生成したlibsを新しいpdb名にパッチする方法を探しています。そのような

$ magic /showPDB a.lib 
> D:\some_users_machine\unique_path\package\Temp\A\Debug.vc110.pdb 

$ magic /newPDB a.lib d:\path\a.pdb 
> New PDB name is d:\path\a.pdb 

消費者は、それは上記のパスでa.pdbを探ししようとしないだろう、私のパッチを適用しa.libをリンクします。もちろん、ほとんどのマシンでは見つからないでしょうが、リンカはまた、a.pdbを探す場所でa.pdbを探します。libが配置されていて、今はすべての人にそれを置くことができました。

編集2:による意見のベースに近いために:私はリンカオプション/ PDBALTPATHを見てみましょうPDBの場所に

+0

まあ、それはこのように動作することを、むしろ重要。 *最終的な* pdbファイルは、実行可能ファイル(dllまたはexe)と一致する必要があります。しかし、ライブラリーがリンクされるまで、そのペダルは金属に合っていない静的ライブラリー・プロジェクトを使用すると、それは延期されなければなりません。その時点で、vcxyz.pdbファイルのデバッグエントリがマージされ、最終的なものが生成されます。あなたは明らかにリンカの警告を生成するとき何か間違っている、あなたは何かがあるかもしれない何か手がかりを残しました。 * 1つの設定に対してこの権利を得ることに最初に焦点を当て、残りは待つことができます。 –

+0

@HansPassant私が行っていることを明確にするために元の投稿を更新しました。 – Samuel

答えて

0

を静的libにの焼きを変更するための技術的な方法を探しています。これにより、バイナリに埋め込まれる別のPDBパスを指定することができます。

/PDBALTPATH:pdb_file_name 

MSDN Article: /PDBALTPATH (Use Alternate PDB Path)

+0

返事をありがとう。しかし、私の問題はビルド後の状況にあります。私は静的なlibsをビルドしていないので、私が保守していないので/ PDBALTPATHを設定することはできません。後でpdbパスを変更する方法を探しています。 – Samuel

+0

/PDBALTPATHは実際にバイナリのリンク時に設定されます。しかし、それはおそらくあなたが望むことをしません。これは、静的ライブラリのPDBの名前を変更することです。 LIB/EXTRACTを使ってlibを抽出し、手動でパスを編集することもできますが、それがうまくいかないかどうかはわかりません。 – syplex

関連する問題