none
同名.cppファイルの自動解決は出来ないのか

    質問

  • 例として、
    winmain.cpp
    hoge.cpp
    dir/hoge.cpp

    といった3個のファイルで構成されているプロジェクトがあるとします。
    これらをビルドすると、ビルドエラーが発生します。

    以前VisualStudio2005を使っていた時は、全く同じ構成のプロジェクトでビルドエラーが起きませんでした。
    何故でしょうか。


    ・・・質問の前に、少し調べてみて基本的な事まではわかりました。
    同名のhoge.cppファイルがあった場合、
    ①ひとつめのhoge.cppをコンパイルしてhoge.objを生成する
    ②hoge.objがあるのでふたつめのhoge.cppのコンパイルが中断される
    ③ふたつめのhoge.cppのコード部がどこにもないためリンクエラーが起きる

    対処法は
    ①ソリューションエクスプローラーで同名の.cppを選択→プロパティを開く
     →C/C++→出力ファイル→"オブジェクト ファイル名"を適切なユニーク名に変更する
    ②.cppファイルが同名にならないように気をつける:-p

    そして、VisualStudio2005では
    同名ファイルがプロジェクトに追加された際に自動で出力ファイル名をhoge.obj, hoge1.obj, hoge2.obj, ...
    と変更している事がわかりました。


    さて、残った質問は
    VisualC++2008 ExpressEditionでの同名.cppファイルの自動解決方法です。
    ①そもそも私の環境が何かおかしい、他の方の環境では自動解決が行われる
    ②ほかの設定法がある(たとえばプロジェクト→プロパティ→C/C++→出力ファイルに入れるべき適切なマクロが存在する)
    ③自動解決には致命的な問題があることが明らかになり、機能削除された
    ④VisualStudioのみの機能でExpressEditionでは機能しない

    など、何かご存じな方がいらっしゃれば是非回答をお願いします。
    2009年8月16日 12:33

回答

  • ①そもそも私の環境が何かおかしい、他の方の環境では自動解決が行われる
    ④VisualStudioのみの機能でExpressEditionでは機能しない

    少なくとも、私の手元の Visual Studio 2008 Professional Edition (SP1 適用済み) でも再現していますので、Express Edition 固有の問題ではないでしょう。 

    ②ほかの設定法がある(たとえばプロジェクト→プロパティ→C/C++→出力ファイルに入れるべき適切なマクロが存在する)
    ③自動解決には致命的な問題があることが明らかになり、機能削除された

    この辺は情報を持ってないです。申し訳ありません。
    互換性がなくなるような変更は一応、Breaking Changes としてまとめられているはずですが、探せていません。
    http://msdn.microsoft.com/en-us/library/bb531344.aspx

    追記。
    検索してみたら、Connect に挙がっていました。
    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=368272
    現在の所、仕様(設計による)の判断のようです。



    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。

    • 回答としてマーク 酒井茂人 2009年8月17日 13:58
    2009年8月16日 13:22
    モデレータ

すべての返信

  • ①そもそも私の環境が何かおかしい、他の方の環境では自動解決が行われる
    ④VisualStudioのみの機能でExpressEditionでは機能しない

    少なくとも、私の手元の Visual Studio 2008 Professional Edition (SP1 適用済み) でも再現していますので、Express Edition 固有の問題ではないでしょう。 

    ②ほかの設定法がある(たとえばプロジェクト→プロパティ→C/C++→出力ファイルに入れるべき適切なマクロが存在する)
    ③自動解決には致命的な問題があることが明らかになり、機能削除された

    この辺は情報を持ってないです。申し訳ありません。
    互換性がなくなるような変更は一応、Breaking Changes としてまとめられているはずですが、探せていません。
    http://msdn.microsoft.com/en-us/library/bb531344.aspx

    追記。
    検索してみたら、Connect に挙がっていました。
    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=368272
    現在の所、仕様(設計による)の判断のようです。



    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。

    • 回答としてマーク 酒井茂人 2009年8月17日 13:58
    2009年8月16日 13:22
    モデレータ
  • Visual Studio 2013ですが、以下の手順で解決出来ます。
    1. ソリューションエクスプローラーからプロジェクトを選択
    2. プロジェクト(p)->プロパティ(p)->構成プロパティ->C/C++->出力ファイルを開く
    3. ASM リストの場所 及び オブジェクト ファイル名 を $(IntDir) から $(IntDir)%(RelativeDir) に変更する

    上記の設定により、.objファイルのファイル名の衝突により、後からコンパイルされたファイルの出力ファイルが先にコンパイルされたファイルの出力ファイルを上書きする事を防ぐ事ができます。

    引用元
    Visual Studioで単一のプロジェクト内に同名のソース・ファイルが含まれていてもビルドが通るようにする方法 - Agate Blog
    http://altebute.hatenablog.com/entry/2015/01/01/235301


    • 編集済み Agate_Pris 2015年1月1日 14:56 誤字修正
    2015年1月1日 14:55