質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

358閲覧

VisualStudioでC++のビルドの挙動がおかしい

fana

総合スコア12010

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2025/01/06 02:03

編集2025/01/13 03:11

Visual Studio の 2019 とか 2022 あたりを使うと,C++のビルドがうまく行かないことが多い様子です.

{いつ,どんなコードで,何をした時}という具体例を示すことができないため,曖昧な話になってしまいますが……
(曖昧すぎて「意見交換」にすべきか迷いましたが,一応,解決したい事柄が存在する話なので「Q&A」側とします)

本来ならば,状況が再現する最小の例のようなものを示すべきなのですが,現状,用意できません.

症状

C++ のプログラムを「ビルド」した際に以下のような症状が起きることがあります.
ある程度の規模がある状況で class のメンバ変数の型を変えた場合等に発生することが多いような気がします.

(1) コンパイルエラーになる
どう考えても問題が無いコードのコンパイルが通りません.

  • 例えば,ある class C の定義が C.h に書かれているとして,この C のメンバ変数の型を m1 から m2 に変えたとき,ビルドすると「 m1 型って何ですか?」という旨のエラーが出たりします.
    m1 型が見なくなるのは,そのようにコードを変更(例えば,不要になった #include "m1.h" の除去)しているから当然ですが,もはやそこに m1 型を使うコードは無いのに執拗に「変更前に m1 型のメンバが書かれていたあたりの行番号」に対してそういうエラーが出てくるのは意味がわかりません.

(2) ビルドは通るが,動かしてみるとどこかの時点(終了時など)に例外(?)が出る
意味不明な挙動です.例えば終了時にどこぞのデストラクタの奥深く(?)で問題が起きたみたいなことを言われるが,そんなことが起こるようなコードを書いてない.

とにかく突然変なことが起きるので「ビルド」の結果を信頼できません.

また,これらの症状は 「リビルド」すれば起きない(:改善される/想定通りにビルドできる) のです.
例えば上記の(2)が発生したとき,全くコードを変更せずに「リビルド」すれば変な例外(?)は起こらなくなります.
しかし毎回リビルドするのでは非常に時間がかかるので厄介です.

想像とか

「インクリメンタルビルド」とか呼ぶのでしょうか?
要は,コード修正の影響範囲のみをコンパイルし直してビルドするようなことが行われるハズですが,この「影響範囲」の決定が上手くいっていないのではないかと想像します. 症状の雰囲気的に.
(型の宣言だけで済ませているような部分があると,「影響範囲」から漏れる? みたいな?)

知りたいこと

{何故こんなことになるのか,どうすれば 改善/回避 できるのか}等.

「ひょっとしてお前……こんなバカみたいなことしてたりしないだろうな?」みたいな話とか無いですかね?

その他

  • 私は Visual Studio を C++ と C# で使っていますが,C#ではこのような問題を経験していません.
  • Visual Studio での C++ はそこそこ長いことやってきた感じなのですが, VS2017 以前を使っていたときにはこのようなことを経験しませんでした.(「VS2017 と VS2022 で同じプログラムをビルドした場合…」みたいな比較があるわけではないので何かを推論する根拠にはならないですが…)
  • {VS2019が入っているPC,VS2022が入っている別のPC}という2つの環境で同じように問題を経験しているので,「単に Visual Studio の何かがぶっ壊れた(再インストールすべき状態)」とかではなくて,何か別の原因というのがあるのではないか? とか想像していますが……
  • (これは記憶が曖昧ですが)デバッグビルド/リリースビルド に依らず起きる.

[追記] これは上記の現象と関係あるのか無いのかわかりませんが……

ビルドが通っても「エラー」ウィンドウに謎のエラー表示(Warningではなくてエラー側の表示)がずっと残り続ける場合が何度かありました.
(:謎のコンパイルエラーを表示してくるのに,ビルドは「成功」したと言われる謎の状況)
これが起きた際には「ソリューションの再スキャン」というのを実行することでとりあえず状況改善することができた様子でした.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

質問文にある情報からは十分な検証ができません。 なので以下は一般論として知られていることから関連しそうな事情を説明するものに過ぎないということをお断りしておきます。

Visual Studio にはプロジェクトのプロパティとして「最小リビルドを有効化する」という項目があります。 これは「いいえ」を選択するべきです。 (マイクロソフトは公式に最小リビルドを非推奨扱いとしています。)

最小リビルドは定義の依存関係などをデータベース化しておいて再コンパイルが必要な箇所の判定に利用しようとしますがいくつかの種類の変更にうまく追従できないことがあります。 故に (データベースに記録された) 古い記述に基づいて処理しようとしてエラーを出すことがあります。

投稿2025/01/14 04:51

SaitoAtsushi

総合スコア5694

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2025/01/16 04:56

問題を起こすことがあるプロジェクトではそのプロパティは「いいえ」になっていましたので,ズバリの回答ではありませんが,有益な情報をいただけたことに感謝いたす次第です.
guest

0

自己解決

未解決です.

……が,もはや回答等がつきそうにはありませんし,teratail的には質問を放置するのはダメそう(?)なので,体裁として「この質問を閉じる」ために,自己解決という形にしておきます.


役に立たない話:

  • git や Mercurial のようなバージョン管理ソフトとの兼ね合い(リビジョンの切替等の際にファイルの新旧具合がどうの的な?)等を疑いましたが,そうであれば「クリーン」や「リビルド」後に単にコード変更した際に問題が発生することの説明が付きませんので,そういう話でもなさそうかな,と.
  • リソースのキャッシュ(?)らしき .aps なるファイルがリソース関係で似たような問題を起こすことはありましたが,それのソースコード版みたいな現象にも見えます.
  • 「再現するような例」を作ろうと試みましたが,そうすると問題を起こせないので,「どのような状況ならば問題が起きるのか?」を明確にすることもできていません.

投稿2025/01/16 05:07

fana

総合スコア12010

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問