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

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

新規登録して質問してみよう
ただいま回答率
85.48%
makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

C++

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

Q&A

1回答

593閲覧

静的ラブラリを指定しているのに未定義の参照と言うエラーが出る原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

C++

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

0グッド

0クリップ

投稿2022/08/18 09:01

提示コードのMakefileですが以下ように静的ライブラリ用のものとプロジェクト用のもの2つに分けたのですがプロジェクト用を実行すると以下の未定義の参照というエラーが出ます。これはなぜでしょうか? ライブラリビルドのコマンドを見るとしっかりとobj/SDLGame.oとうように静的ラブラリに含まれていますが。これは何が原因なのかわかりません。

library make command
shigurechan@shigurechan-System-Product-Name:~/Program/SDLGame/lib$ make ar rcs libSDLGame.a `obj/SDLGame.o` obj/IMG.o obj/IMG_WIC.o obj/IMG_bmp.o obj/IMG_gif.o obj/IMG_jpg.o obj/IMG_lbm.o obj/IMG_pcx.o obj/IMG_png.o obj/IMG_pnm.o obj/IMG_svg.o 省略
Project make commmand
shigurechan@shigurechan-System-Product-Name:~/Program/SDLGame/Pong$ make g++ obj/Game.o obj/Main.o -o program -L../lib/libSDLGame.a /usr/bin/ld: obj/Game.o: in function `Game::Loop()': Game.cpp:(.text+0x51): undefined reference to `SDLGame::KeyEvent()' /usr/bin/ld: Game.cpp:(.text+0x6e): undefined reference to `SDLGame::GetKeyCode()' /usr/bin/ld: obj/Main.o: in function `main': Main.cpp:(.text+0x4b): undefined reference to `SDLGame::Initialize(char const*, glm::vec<2, int, (glm::qualifier)0>)' /usr/bin/ld: Main.cpp:(.text+0x92): undefined reference to `SDLGame::Finalize()' collect2: error: ld returned 1 exit status make: *** [Makefile:15: program] エラー 1 shigurechan@shigurechan-System-Product-Name:~/Program/SDLGame/Pong$
library

Makefile

1# ライブラリ 2LIB_SRC_DIR :=src 3LIB_OBJ_DIR :=obj 4LIB_DEP_DIR :=obj 5LIB_DEP :=$(wildcard $(LIB_DEP_DIR)/*.d) 6LIB_SRC :=$(wildcard $(LIB_SRC_DIR)/*.cpp) 7LIB_OBJ :=$(addprefix $(LIB_OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(LIB_SRC)))) $(wildcard $(LIB_OBJ_DIR)/*.o) 8LIB :=libSDLGame.a 9 10# ライブラリ 11$(LIB): $(LIB_OBJ) 12 ar rcs $@ $(LIB_OBJ) 13 14$(LIB_OBJ_DIR)/%.o: src/%.cpp 15 $(CXX) -c -MMD -MP $< -o $@ 16-include $(LIB_DEP) 17 18# ライブラリ オブジェクト抽出 19ext_lib: 20 ar x /usr/lib/x86_64-linux-gnu/libSDL2.a --output $(OBJ_DIR) 21 ar x /usr/lib/x86_64-linux-gnu/libSDL2main.a --output $(OBJ_DIR) 22 ar x /usr/lib/x86_64-linux-gnu/libSDL2_image.a --output $(OBJ_DIR) 23 24clean: 25 rm -f ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d $(LIB) 26
Project

Makefile

1PRG :=program 2SRC_DIR :=src 3OBJ_DIR :=obj 4DEP_DIR :=obj 5DEP :=$(wildcard $(DEP_DIR)/*.d) 6SRC :=$(wildcard $(SRC_DIR)/*.cpp) 7OBJ :=$(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) 8 9LIB := ../lib/libSDLGame 10 11 12 13 14$(PRG): $(OBJ) 15 $(CXX) $(OBJ) -o $@ -L../lib/libSDLGame.a 16 17 18 19$(OBJ_DIR)/%.o: src/%.cpp 20 $(CXX) -c -MMD -MP $< -o $@ 21-include $(DEP) 22 23clean: 24 rm -f ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d $(PRG) 25

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

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

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

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

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

guest

回答1

0

Makefile

1 $(CXX) $(OBJ) -o $@ -L../lib/libSDLGame.a

ライブラリを指定していないからでしょう。-L../lib -lSDLGame では。

投稿2022/08/18 09:06

int32_t

総合スコア20856

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

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

退会済みユーザー

退会済みユーザー

2022/08/18 09:18

質問ですが以下のようにしたのですが以下のエラーが出ますこれはなぜでしょうか? [ $(PRG): $(OBJ) # $(CXX) $(OBJ) -o $@ -L../lib -lSDLGame.a $(CXX) $(OBJ) -o $@ -L../lib -lSDLGame ] shigurechan@shigurechan-System-Product-Name:~/Program/SDLGame/Pong$ make g++ obj/Game.o obj/Main.o -o program -L../lib -lSDLGame /usr/bin/ld: ../lib/libSDLGame.a(SDL_waylandmouse.o): in function `Wayland_CreateCursor': (.text+0x209): undefined reference to `wl_proxy_get_version' /usr/bin/ld: (.text+0x227): undefined reference to `wl_proxy_marshal_flags'
int32_t

2022/08/18 09:25

libSDLGamae.a (の中にあるSDLのオブジェクト)が他のライブラリに依存しているのでしょう。
SaitoAtsushi

2022/08/18 09:41

依存関係は pkg-config コマンドで見れますよ。 インストールされていれば。
退会済みユーザー

退会済みユーザー

2022/08/18 10:12 編集

誤投稿です
退会済みユーザー

退会済みユーザー

2022/08/18 10:47

なるほどプロジェクト側でライブラリを指定すると実行できるのですが 「 $(CXX) $(OBJ) -o $@ -L../lib -lSDLGame -lSDL2main -lSDL2 -lSDL2_image 」
int32_t

2022/08/18 22:04

*.so とリンクして実行ファイルを作るとき、*.so の中の未解決シンボルは探されません。*.so の中には依存ライブラリ名が入っていて、実行時に依存ライブラリを探して動的リンクします。 *.a には依存ライブラリ名など入れられません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問