こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ビルドから除外されたソースのコンパイル

現在、Visual Studioを使用してある巨大なプロジェクトを開発しています。言語は
C++です。
このプロジェクトには、ソースファイル(*.cpp)が全部で1000以上もありま
す。百ではありません、千です。
そのため、プロジェクトをビルドするのに30分以上もかかり、開発効率が非常に悪
くなっています。
コンパイル・リンクとも相当の時間がかかっています。実感としては、cpp1ファイ
ルにつきコンパイル1秒かかっています。
(なぜそんなに大量のcppが必要なのかというのはここでは置いといてください)

そこで、次のような方法でビルド時間を短縮する方法を考案しました。

(1)ある一定数のソースファイルのプロパティで「ビルドから除外」とする。
(2) (1)でビルドから除外したソースファイルを全てインクルードしたソース
ファイルを作成し、プロジェクトに追加する。

[1つにまとめたソースファイルのイメージ]
#include "src001.cpp"
#include "src002.cpp"
#include "src003.cpp"
・・・
#include "src999.cpp"


ソースファイルを1つにまとめてしまう事による弊害は全て解決したものとします。
以上により、プロジェクト内のソースファイル数を100以下にまで減らし、無事ビ
ルド時間が大幅に短縮されました。

と、ここまでは良かったのですが、一つ問題があります。
それは、「ビルドから除外」したソースファイルを単独でコンパイル出来なくなって
しまうのです。(ここでは、そういうことをしたいという要望があると思ってくださ
い)
ソリューションエクスプローラでソースファイルを右クリックし、出てくるメニュー
リストの「コンパイル」が無効表示され選択できません。
もちろん、コンパイルコマンド(cl.exe)をコマンドラインから直接叩いてやればい
くらでも出来ますが、出来ればIDEから簡単な操作で行いたいのです。
また、チームで開発しているため、コンパイルする時だけソースファイルの設定を変
更するというようなことはしたくないのです。

この問題に対して、何か良い手段はないでしょうか?


プロジェクトを複数モジュールに分離して・・・
とか、
プリコンパイル済みヘッダを利用して・・・
とか、
リビルド時間を短縮するためソース間の依存関係を減らして・・・

というような、質問の内容を超える回答はご遠慮ください。
そのようなことは、十分ではないかも知れませんが検討済みです。

投稿日時 - 2013-06-19 19:46:21

QNo.8141031

困ってます

質問者が選んだベストアンサー

#4です。

バッチを作って、外部ツールに登録しておくだけだと思いますが...
引数に$(ItemFileName)を指定すれば、選択しているソースファイルをバッチに渡せます。

投稿日時 - 2013-06-21 01:37:55

お礼

ご回答ありがとうございます。
確かにその通りです。そういう技があったのですね試してみることにします。

投稿日時 - 2013-06-22 08:46:52

ANo.6

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(9)

ANo.9

>ただ、たったそれだけのために余分な紛らわしいプロジェクトを1つ追加してしまうことは、大人数で開発を行っている現場ではなかなか許されないのです。勘違いしてしまう人がいないとも限りませんから。

それをいってしまうなら、今の様な状態やその対処方法をふつうだと勘違いする人がいるかもしれないことの危惧もされた方がよいかと思いますが(正直いえば、紛らわしい対処方法をすでにやっておいて何をいまさらって感じ)

投稿日時 - 2013-06-23 13:19:12

ANo.8

> プロジェクトが2つ出来るということは、本目的のためだけにプロジェクトを
> 切り替えなければならないという面倒が生じます。

ソリューションの中にもうひとつ個別コンパイル用プロジェクト"single-compile"を起こし、
「XXX.cppだけコンパイルしたいときはsingle-compileからXXX.cppを選んで"コンパイル"してね」
だけのことやと思うけど、これがそんなに面倒ですか?

投稿日時 - 2013-06-22 18:49:28

お礼

面倒ではありません。ただ、たったそれだけのために余分な紛らわしいプロジェクトを1つ追加してしまうことは、大人数で開発を行っている現場ではなかなか許されないのです。勘違いしてしまう人がいないとも限りませんから。

投稿日時 - 2013-06-22 22:03:37

回答No.2 の「プロジェクトを2つ作る」方法は、別に既存のプロジェクトファイルの構成を壊してはいないように思えますが。

投稿日時 - 2013-06-22 00:21:55

お礼

確かに既存のプロジェクトの構成は維持していますが、プロジェクトが2つ出来るということは、本目的のためだけにプロジェクトを切り替えなければならないという面倒が生じます。

投稿日時 - 2013-06-22 08:48:44

ANo.5

そういう事のできるVisualStudioのプラグインでも作るしかないんじゃないでしょうか。

単独でコンパイルしたいというのは

>[1つにまとめたソースファイルのイメージ]
>#include "src001.cpp"
>#include "src002.cpp"
>#include "src003.cpp"
>・・・
>#include "src999.cpp"

上記のsrc001.cpp等なんでしょうけど、今の状況で単独コンパイルできるようにする方が問題だと私は思いますが(コンパイルはできてもリンクでエラーが発生するとか出てきそうだから)。

投稿日時 - 2013-06-20 20:43:34

お礼

ご回答ありがとうございます。
プロジェクトの設定としてはsrc001.cpp等は全てビルドから除外していますので、リンクの対象とならないような動作を期待しています。

投稿日時 - 2013-06-20 20:47:43

ANo.4

ソースコードの構成その他に根本的な問題があると思いますが、おそらくそれはわかっていると思うので...

> もちろん、コンパイルコマンド(cl.exe)をコマンドラインから直接叩いてやればい
> くらでも出来ますが、出来ればIDEから簡単な操作で行いたいのです。

コマンドラインで操作するのが簡単ではない理由は何ですか?
もし、大量のオプションを指定しなければならないことが理由であれば、バッチファイルでも作っておけば解決します。
(バッチファイルのアイコンに、ソースファイルをドラッグ&ドロップするだけになります)

投稿日時 - 2013-06-20 20:10:11

お礼

ご回答ありがとうございます。
確かにその通りですがね。出来ればVSの中だけで出来る方法を見つけたかったのです。バッチで構わないというならここで聞くまでもありません。

投稿日時 - 2013-06-20 20:23:17

ANo.3

>そのため、プロジェクトをビルドするのに30分以上もかかり、開発効率が非常に悪
くなっています。

「ビルド」と書かれていますが、これは「リビルド」の事なんでしょうか。

>リビルド時間を短縮するためソース間の依存関係を減らして・・・
>
>というような、質問の内容を超える回答はご遠慮ください。
>そのようなことは、十分ではないかも知れませんが検討済みです。

と書かれている事からそんな気がするのですけど。

というか、ソース間の依存関係って*.cpp同士に依存関係があるという事なんでしょうか。

投稿日時 - 2013-06-20 07:23:38

お礼

ご回答ありがとうございます。
ビルドでもリビルドでもかなりの時間がかかるのです。作りが悪いことは分かっているのですが、今更どうしようもないのですよ。

投稿日時 - 2013-06-20 20:27:51

ANo.2

僕ならプロジェクトをふたつ作る。
# もちろんソースコードは共有して

投稿日時 - 2013-06-20 05:33:02

お礼

ご回答ありがとうございます。
そういう事が可能なら苦労はしないのですが。
なるべく今のままの構成を保ちたいのです。

投稿日時 - 2013-06-20 20:18:07

ソースファイルを纏めた結果、その「まとまった」ソースに対する「1つの」オブジェクトが生成されるようになってしまっている筈です。
この場合、その一部を書き換えた上でビルドするには、当然その「1つの」オブジェクトを生成するために、「一纏まりの」ソースをコンパイルする必要があります(リンカの動作はご存知でしょうか)。
その為、(ビルドから除外した)特定のソースファイルを単独でコンパイルする、という柔軟性を必然的に失ってしまっていることでしょう。

私ならそのような方法の代わりに、(mingwの)GNU Makeでビルドしたいです。依存関係を自動的に洗ってくれる、ファイルの更新日時を見て必要最小限のコンパイルで済ましてくれる、可能な限り多重のプロセスを用いて並列に実行させることが出来る(-jオプション)といった優れた結果が得られるので。

投稿日時 - 2013-06-20 03:59:35

お礼

ご回答ありがとうございます。
Visual Studio以外のツールは想定していません。

投稿日時 - 2013-06-20 20:17:20

あなたにオススメの質問