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

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

ただいまの
回答率

87.50%

makefile 特定のオブジェクトファイルがg++ コマンドの行に乗らない生成されない原因が知りたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 295
退会済みユーザー

退会済みユーザー

提示コードのmakefileですがsource/%.cppを使ってsourceディレクトリファイルを全部見ているのですが なぜColor.oだけg++のリンクコマンドに乗らないのでしょうか?ワイルドカードを使っているのでディレクトリ内全部がリンク対象のはずです。

参考サイトA: https://qiita.com/aosho235/items/8e90bf09795758cfb70b

g++ obj/Fps.o obj/Scene.o obj/Entry.o obj/Main.o obj/Screen.o obj/Log.o obj/Edit.o -l ncurses -o AAEditor
Shigurechan@shigurechan-System-Product-Name:~/program/AAEditor$ cd source
shigurechan@shigurechan-System-Product-Name:~/program/AAEditor/source$ ls
Color.cpp  Edit.cpp  Entry.cpp  Fps.cpp  Log.cpp  Main.cpp  Scene.cpp  Screen.cpp
shigurechan@shigurechan-System-Product-Name:~/program/AAEditor/source$ cd ../header
shigurechan@shigurechan-System-Product-Name:~/program/AAEditor/header$ ls
Bit.hpp  Character.hpp  Color.hpp  Edit.hpp  Entry.hpp  Fps.hpp  Log.hpp  Scene.hpp  Screen.hpp  Vector.hpp
shigurechan@shigurechan-System-Product-Name:~/program/AAEditor/header$ 
PRG         :=AAEditor
SRC_DIR     :=source
OBJ_DIR     :=obj
DEP_DIR     :=obj
DEP        :=$(wildcard $(DEP_DIR)/*.d)
SRC         :=$(wildcard $(SRC_DIR)/*.cpp)
OBJ         :=$(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC))))

#$(warning SRC = $(SRC)); #デバッグ
#$(warning OBJ = $(OBJ)); #デバッグ


$(PRG): $(OBJ)
    $(CXX) $^ -l ncurses -o $@

$(OBJ_DIR)/%.o: source/%.cpp
    $(CXX) -c -MMD -MP $^ -o $@
-include $(DEP)

clean:
    rm -f ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d *.a $(PRG)

make --debug=m コマンドを実行

$ make --debug=m
GNU Make 4.2.1
このプログラムは x86_64-pc-linux-gnu 用にビルドされました
Copyright (C) 1988-2016 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 以降 <http://gnu.org/licenses/gpl.html>
これはフリーソフトウェアです: 自由に変更および配布できます.
法律の許す限り、 無保証 です.
makefile を読み込みます...
Makefile:11: SRC = source/Fps.cpp source/Color.cpp source/Scene.cpp source/Entry.cpp source/Main.cpp source/Screen.cpp source/Log.cpp source/Edit.cpp
Makefile:12: OBJ = obj/Fps.o obj/Color.o obj/Scene.o obj/Entry.o obj/Main.o obj/Screen.o obj/Log.o obj/Edit.o
makefile の更新中....
最終ターゲットを更新中....
 ファイル 'AAEditor' が存在しません.
ターゲット 'AAEditor' を再make する必要があります.
g++ obj/Fps.o obj/Color.o obj/Scene.o obj/Entry.o obj/Main.o obj/Screen.o obj/Log.o obj/Edit.o -l ncurses -o AAEditor
/usr/bin/ld: obj/Color.o: in function `InitColorPairs()':
Color.cpp:(.text+0xdf): undefined reference to `GetColorNum(int, int)'
/usr/bin/ld: obj/Color.o: in function `SetColor(int, int)':
Color.cpp:(.text+0x140): undefined reference to `GetColorNum(int, int)'
/usr/bin/ld: obj/Color.o: in function `UnSetColor(int, int)':
Color.cpp:(.text+0x1af): undefined reference to `GetColorNum(int, int)'
/usr/bin/ld: obj/Screen.o: in function `Screen::Screen()':
Screen.cpp:(.text+0x1cc): undefined reference to `GetColorNum(int, int)'
/usr/bin/ld: obj/Screen.o: in function `Screen::UpdateScreen()':
Screen.cpp:(.text+0x331): undefined reference to `GetColorNum(int, int)'
/usr/bin/ld: obj/Screen.o:Screen.cpp:(.text+0x47b): more undefined references to `GetColorNum(int, int)' follow
collect2: error: ld returned 1 exit status
make: *** [Makefile:16: AAEditor] エラー 1

make clean 後再度実行 $(warning)関数を利用

$ make
Makefile:11: SRC = source/Fps.cpp source/Color.cpp source/Scene.cpp source/Entry.cpp source/Main.cpp source/Screen.cpp source/Log.cpp source/Edit.cpp
Makefile:12: OBJ = obj/Fps.o obj/Color.o obj/Scene.o obj/Entry.o obj/Main.o obj/Screen.o obj/Log.o obj/Edit.o
g++ obj/Fps.o obj/Color.o obj/Scene.o obj/Entry.o obj/Main.o obj/Screen.o obj/Log.o obj/Edit.o -l ncurses -o AAEditor
/usr/bin/ld: obj/Color.o: in function `InitColorPairs()':
Color.cpp:(.text+0xdf): undefined reference to `GetColorNum(int, int)'
/usr/bin/ld: obj/Color.o: in function `SetColor(int, int)':
Color.cpp:(.text+0x140): undefined reference to `GetColorNum(int, int)'
/usr/bin/ld: obj/Color.o: in function `UnSetColor(int, int)':
Color.cpp:(.text+0x1af): undefined reference to `GetColorNum(int, int)'
/usr/bin/ld: obj/Screen.o: in function `Screen::Screen()':
Screen.cpp:(.text+0x1cc): undefined reference to `GetColorNum(int, int)'
/usr/bin/ld: obj/Screen.o: in function `Screen::UpdateScreen()':
Screen.cpp:(.text+0x331): undefined reference to `GetColorNum(int, int)'
/usr/bin/ld: obj/Screen.o:Screen.cpp:(.text+0x47b): more undefined references to `GetColorNum(int, int)' follow
collect2: error: ld returned 1 exit status
make: *** [Makefile:16: AAEditor] エラー 1
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2021/09/16 16:59

    それを修正したらコンパイルは通るのですがコードを修正してコンパイルすると
    $ make
    g++ -c -MMD -MP source/Screen.cpp source/../header/Screen.hpp source/../header/../lib/ncurses/include/curses.h source/../header/Vector.hpp source/../header/Character.hpp source/../header/Color.hpp -o obj/Screen.o
    g++: fatal error: cannot specify ‘-o’ with ‘-c’, ‘-S’ or ‘-E’ with multiple files
    compilation terminated.
    make: *** [Makefile:17: obj/Screen.o] エラー 1


    こういったエラーがでます。

    キャンセル

  • int32_t

    2021/09/16 17:07

    そのエラーはこの質問(Color.oが含まれない)とは関係ありません。

    キャンセル

  • episteme

    2021/09/16 17:21 編集

    > g++ -c -MMD -MP source/Screen.cpp source/../header/Screen.hpp ...

    なんでヘッダーをコンパイルしてるん?

    キャンセル

回答 1

check解決した方法

-5

最後のコード引用のエラーの原因は単純に GetColorNum(int, int) の実装が存在しないだけなのでそれを修正したらコンパイルが通りました。
しかし依然としてコードを修正してコンパイルするとエラーがでるのですがこの質問の内容は解決したいので解決とします。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • C++に関する質問
  • makefile 特定のオブジェクトファイルがg++ コマンドの行に乗らない生成されない原因が知りたい