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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

C++

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

Q&A

解決済

4回答

2653閲覧

hファイルではビルド成功。cppではビルド失敗。

tomotomtony

総合スコア14

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

C++

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

0グッド

0クリップ

投稿2019/07/04 08:45

編集2019/07/04 23:51

[背景]
windows10 VisualStudio2013でC++の開発をしています。
既に開発済みのプロジェクトに新しくcppファイルとhファイルを追加し、
ソリューション全体でビルドしたところ、エラーが発生しています。

[エラー]
error LNK2019: 未解決の外部シンボル "public: __cdecl AAA::AAA" (※※※) が関数 "public: __cdecl BBB::BBB" (※※※) で参照されました。

[試したこと]
1.
・hファイルをデフォルトコンストラクタとデストラクタの宣言のみにした。
・cppファイルをデフォルトコンストラクタとデストラクタの定義のみにした。
結果:上記と同様のビルドエラーが発生。

2.
・hファイルをデフォルトコンストラクタとデストラクタの定義のみにした。
・cppファイルを空(#include"AAA.h"のみ)にした。
結果:ビルド成功

[質問]
ビルドエラーの要因は、cppファイルがヘッダーファイルを参照できていないこと
だと考えております。
どのすれば、cppからヘッダーファイルを参照できるようになりますか?

下記は、ビルドが失敗した際の簡略版です。

//ヘッダーファイル #ifndef AAA_H #define AAA_H class AAA; class AAA { public: /** * @brief デフォルトコンストラクタ */ AAA(); /** * @brief デストラクタ */ virtual ~AAA(); }; #endif // ANALYZEGAZEDIRECTIONFACADE_H
//cppファイル #include "AAA.h" /** * @brief デフォルトコンストラクタ */ AAA::AAA() { //m_CalibrationInfo.init();//キャリブレーションが必要になったら実装する。 } /** * @brief デストラクタ */ AAA::~AAA() { }

下手な説明で申し訳ありませんが、よろしくお願いします。

AAAクラスを呼び出しているBBBクラスのヘッダーファイルとcppファイルも記載します。

//BBB.h AAAクラスを呼び出している側 //#include "AAA" class BBB; class AAA; class BBB { friend class BBBTest; protected:       AAA* m_AAA; public: /** * @brief デフォルトコンストラクタ */ BBB(); /** * @brief デストラクタ */ virtual ~BBB(); }
//BBB.cpp #include "BBB.h" #include "AAA.h" /** * @brief デフォルトコンストラクタ */ BBB::BBB() :m_AAA(nullptr) { m_AAA = new(std::nothrow) AAA; } /** * @brief デストラクタ */ BBB::~BBB() { if (nullptr != m_AAA) { delete m_AAA; } }

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

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

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

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

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

fana

2019/07/04 08:58

提示された2つのコード(ヘッダとcpp)に何の関連性も無いように見えるのですが.
tomotomtony

2019/07/04 23:05

すいません。cpp側のコンストラクタとデストラクタの関数名と、includeファイル名が間違っていました。headerファイルで宣言したコンストラクタとデストラクタをcpp側で定義しようとしています。よろしくお願いします。
tomotomtony

2019/07/05 04:18

ご回答、ありがとうございます。 無事解決しました。 おっしゃ通り、ソースコードではなくビルド設定の問題でした。 掲載したソースコードは、実際にビルドしているモノではなく、簡略化したコードした。 説明不足でした。すいません。 [実際のビルド環境] 環境はmainのプロジェクトと数十個の既存のスタティックライブラリを インクルードしていたソリューションです(ビルド成功済み)。 そこに新しく作成したスタティックライブを追加した際に発生したエラーでした。 [ビルドエラー解決方法] ライブラリAAAを読み込んでいるライブラリBBBに、「追加のインクルードディレクトリ」の設定していましたが、 不十分でした。 mainのプロジェクト(スタートアップ)にも”新規で作成したライブラリAAAのインクルード”を設定したことで、 LINKエラーが解決しました。 お騒がせしました。 皆様、ご協力ありがとうございました。
guest

回答4

0

class AAAのコンストラクタの実体はどこにあるのでしょうか?
なければ、AAAのオブジェクトを生成すると、リンカーで未解決シンボルのエラーが出ますよ。
もし、AAAのオブジェクトを生成してなければリンク解決の必要がないのでエラーは出ません。

投稿2019/07/04 09:39

PineMatsu

総合スコア3579

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

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

tomotomtony

2019/07/04 23:53

記載しているソースが間違っていました。 修正したのでよろしくお願いします AAA.cpp側で実態を作成したつもりです。
guest

0

ベストアンサー

おそらく,実際に問題が出ているコードではないものを提示されていると思うのですが,
これら(AAA.h,AAA,cpp,BBB.h,BBB.cpp)を用いて問題が再現しているのでしょうか?

新しい Windowsコンソールアプリケーション プロジェクトをVS2017で作り,
4つのファイル AAA.h, AAA.cpp, BBB.h, BBB.cpp をプロジェクトに追加し,
提示コードをコピーしてみました.
下記いくつかの問題があり,それを修正すればビルドできました.

  • 全角スペースが存在したので除去
  • BBB.hの末尾(class BBBの定義の末尾)に ; を追加
  • BBB.cpp に(std::nothrowのために) #include <new> を追加
  • (プロジェクトは,プリコンパイル済みヘッダを使用しない設定に)

AAA.cpp相当のファイルが存在はするけれどもプロジェクトには追加されていないとか,
あるいは,「ビルドから除外」みたいな設定になってしまっているとか,そういうことはないでしょうか?

投稿2019/07/05 01:15

編集2019/07/05 01:18
fana

総合スコア11632

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

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

tomotomtony

2019/07/05 04:19

ご回答、ありがとうございます。 無事解決しました。 おっしゃ通り、ソースコードではなくビルド設定の問題でした。 掲載したソースコードは、実際にビルドしているモノではなく、簡略化したコードした。 説明不足でした。すいません。 [実際のビルド環境] 環境はmainのプロジェクトと数十個の既存のスタティックライブラリを インクルードしていたソリューションです(ビルド成功済み)。 そこに新しく作成したスタティックライブを追加した際に発生したエラーでした。 [ビルドエラー解決方法] ライブラリAAAを読み込んでいるライブラリBBBに、「追加のインクルードディレクトリ」の設定していましたが、 不十分でした。 mainのプロジェクト(スタートアップ)にも”新規で作成したライブラリAAAのインクルード”を設定したことで、 LINKエラーが解決しました。 お騒がせしました。 皆様、ご協力ありがとうございました。
guest

0

ビルドエラーの要因は、cppファイルがヘッダーファイルを参照できていない

違います。すでに回答があるように、リンクエラー(LNKxxxx)です。

error LNK2019: 未解決の外部シンボル "public: cdecl AAA::AAA" (※※※) が関数 "public: cdecl BBB::BBB" (※※※) で参照されました。

書かれている通りに、BBB::BBB関数(コンストラクタ) で、AAA::AAA呼び出されているが、その実体が見つからないという事です。
ヘッダファイルが無い場合は、別のエラー(コンパイルエラー)となります。

CPPファイルに

C++

1AAA::AAA() 2{ 3 // .... 4}

の関数(コンストラクタ)定義はありますか?

投稿2019/07/04 14:36

pepperleaf

総合スコア6383

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

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

tomotomtony

2019/07/04 23:18

記載していたスースコードが間違っていました。 修正しました。 コンストラクタをcppで定義しています。 試しに、簡単なメンバ変数(int型)をheader側でpublicで宣言し、 cpp側のコンストラクタの定義内で値を代入するように変更し、 ビルドしてみました。 しかし、同様のリンクエラーが発生してしまいます。
guest

0

BBB::BBB の実体を書いているソースファイルにAAAクラスを書いてあるヘッダファイルをincludeしてください

投稿2019/07/04 09:40

izmktr

総合スコア2856

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

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

tomotomtony

2019/07/04 23:42

インクルード済みでした。BBB::BBBの実態を書いているcppとヘッダーのそれぞれでインクルードを記載してみましたが、エラーが出力されました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問