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

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

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

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

C++

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

Q&A

0回答

566閲覧

[Makefile] 静的ラブラリを生成してヘッダーファイルをインクルードしても未定義となる原因が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

makefile

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

C++

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

0グッド

0クリップ

投稿2022/08/17 11:08

編集2022/08/18 04:42

提示コードですが以前作成したMakefileを使って今回のソースファイルを静的ライブラリにするコードを書いているのですが静的ライブラリは生成されるのですが利用プロジェクトでインクルードして実行すると未定義の参照というエラーが出ます。これはなぜでしょうか?

確認したいこと

ディレクトリの場所を確認

ライブラリ部ヘッダー

hpp

1#ifndef ___SDLGAME_HPP___ 2#define ___SDLGAME_HPP___ 3#include <SDL2/SDL.h> 4#include <SDL2/SDL_image.h> 5#include <iostream> 6#include <glm/glm.hpp> 7 8namespace SDLGame 9{ 10 enum class KeyCode 11 { 12 Up, 13 Down, 14 Left, 15 Right, 16 None, 17 18 Escape, 19 }; 20 21 22 void RenderRectangle(const glm::ivec3 color,const glm::ivec2 pos,const glm::ivec2 size); //矩形描画 23 void Event(); //キー入力 十字キー 24 KeyCode GetKeyCode(); //キー入力取得 25 bool Initialize(const char* title,const glm::ivec2 size); //初期化 26 void Finalize(); //終了処理 27 int GetRandom(const int n); //乱数 取得 28 29}; 30 31#endif
ライブラリ部ソース

cpp

1#include "SDLGame.hpp" 2#include <SDL2/SDL.h> 3#include <SDL2/SDL_image.h> 4#include <glm/glm.hpp> 5#include <locale.h> 6#include <random> 7#include <fstream> 8 9static SDL_Window *window; 10static SDL_Renderer *render; 11 12static SDLGame::KeyCode key; 13static SDL_Event event; 14#ifdef NEED_RENDERER_SOFTWARE 15#define SDL_RENDERER_FLAGS (SDL_RENDERER_SOFTWARE) 16#else 17#define SDL_RENDERER_FLAGS (0) 18#endif 19 20#define SDL_PrintError(name) 21 22/*################################################# 23#キーを取得 24###################################################*/ 25SDLGame::KeyCode SDLGame::GetKeyCode() 26{ 27 return key; 28} 29/*################################################# 30# イベント 31###################################################*/ 32void SDLGame::Event() 33{ 34 while(SDL_PollEvent(&event) == 1) 35 { 36 if(event.type == SDL_KEYDOWN) 37 { 38 switch(event.key.keysym.sym) 39 { 40 case SDLK_DOWN: 41 { 42 key = KeyCode::Down; 43 } 44 break; 45 46 case SDLK_UP: 47 { 48 key = KeyCode::Up; 49 } 50 break; 51 52 case SDLK_LEFT: 53 { 54 55 56 key = KeyCode::Left; 57 58 } 59 break; 60 61 case SDLK_RIGHT: 62 { 63 64 key = KeyCode::Right; 65 } 66 break; 67 68 case SDLK_ESCAPE: 69 { 70 71 key = KeyCode::Escape; 72 } 73 break; 74 75 default: 76 { 77 key = KeyCode::None; 78 } 79 } 80 } 81 } 82} 83 84 85void SDLGame::RenderRectangle(const glm::ivec3 color,const glm::ivec2 pos,const glm::ivec2 size) 86{ 87 SDL_Rect rect; 88 rect.x = pos.x; 89 rect.y = pos.y; 90 rect.w = size.x; 91 rect.h = size.y; 92 93 SDL_SetRenderDrawColor(render, color.x,color.y,color.z, 255); 94 SDL_RenderFillRect(render, &rect); 95 SDL_SetRenderDrawColor(render, 0, 0, 0, 255); 96} 97 98bool SDLGame::Initialize(const char* title,const glm::ivec2 size) 99{ 100 if(SDL_Init(SDL_INIT_VIDEO) < 0) 101 { 102 std::cerr<< SDL_GetError() << std::endl; 103 104 return false; 105 } 106 107 int flags = IMG_INIT_JPG|IMG_INIT_PNG; 108 int initted = IMG_Init(flags); 109 if( (initted&flags) != flags) 110 { 111 std::cerr<< IMG_GetError() << std::endl; 112 } 113 114 115 116 window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED, size.x,size.y, 0); 117 if (window == nullptr) 118 { 119 std::cerr<< SDL_GetError() << std::endl; 120 121 SDL_DestroyWindow(window); 122 SDL_Quit(); 123 124 return false; 125 } 126 127 render = SDL_CreateRenderer(window, -1, SDL_RENDERER_FLAGS); 128 129 if (render == nullptr) 130 { 131 std::cerr<< SDL_GetError() << std::endl; 132 133 SDL_DestroyWindow(window); 134 SDL_Quit(); 135 136 return false; 137 } 138 139 return true; 140} 141 142void SDLGame::Finalize() 143{ 144 SDL_DestroyRenderer(render); 145 SDL_DestroyWindow(window); 146 SDL_Quit(); 147} 148 149 150/*################################################# 151# 乱数を取得 152###################################################*/ 153int SDLGame::GetRandom(const int n) 154{ 155 std::random_device seed_gen; 156 std::default_random_engine engine(seed_gen()); 157 std::uniform_int_distribution<> dist(0, n); 158 159 return dist(engine); 160}
利用部

cpp

1#include <SDL2/SDL.h> 2#include <SDL2/SDL_image.h> 3#include <glm/glm.hpp> 4#include "../../lib/src/SDLGame.hpp" 5#include <locale.h> 6#include <random> 7#include <fstream> 8#include <iostream> 9#include "Game.hpp" 10#define PI ((float)3.14f) 11 12/*################################################# 13# 初期化 14###################################################*/ 15Game::Game(SDL_Renderer *ren) 16{ 17 SDLGame::Initialize("aaaa",glm::ivec2(10,10)); 18 render = ren; 19 rect = new SDL_Rect{10,10,10,10}; 20 position = glm::ivec2(0,0); 21} 22
今回のもの

makefile

1LIB :=SDLGame.a 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)))) $(wildcard $(OBJ_DIR)/*.o) 8 9$(OBJ_DIR)/%.o: src/%.cpp 10 $(CXX) -c -MMD -MP $< -o $@ 11-include $(DEP) 12 13$(LIB): $(OBJ) 14 ar rcs $@ $(OBJ) 15 16# ライブラリ オブジェクト抽出 17ext_lib: 18 ar x /usr/lib/x86_64-linux-gnu/libSDL2.a --output $(OBJ_DIR) 19 ar x /usr/lib/x86_64-linux-gnu/libSDL2main.a --output $(OBJ_DIR) 20 ar x /usr/lib/x86_64-linux-gnu/libSDL2_image.a --output $(OBJ_DIR) 21 22clean: 23 rm -f ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d $(LIB)
以前作成したもの

makefile

1# ライブラリ 2LIB_DIR :=lib 3LIB_SRC_DIR :=$(LIB_DIR)/src 4LIB_OBJ_DIR :=$(LIB_DIR)/obj 5LIB_DEP_DIR :=$(LIB_DIR)/obj 6LIB_DEP :=$(wildcard $(LIB_DEP_DIR)/*.d) 7LIB_SRC :=$(wildcard $(LIB_SRC_DIR)/*.cpp) 8LIB_OBJ :=$(addprefix $(LIB_OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(LIB_SRC)))) $(wildcard $(LIB_OBJ_DIR)/*.o) 9LIB :=lib/libconsole.a 10 11# プロジェクト 12SRC_DIR :=src 13OBJ_DIR :=obj 14DEP_DIR :=obj 15DEP :=$(wildcard $(DEP_DIR)/*.d) 16SRC :=$(wildcard $(SRC_DIR)/*.cpp) 17OBJ :=$(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) 18PRG :=program 19 20# プロジェクト 21$(PRG): $(OBJ) $(LIB) 22 $(CXX) $(OBJ) -o $@ $(LIB) 23 24$(OBJ_DIR)/%.o: src/%.cpp 25 $(CXX) -c -MMD -MP $< -o $@ 26-include $(DEP) 27 28# ライブラリ 29$(LIB): $(LIB_OBJ) 30 ar rcs $@ $(LIB_OBJ) 31 32$(LIB_OBJ_DIR)/%.o: lib/src/%.cpp 33 $(CXX) -c -MMD -MP $< -o $@ 34-include $(LIB_DEP) 35 36# ライブラリ オブジェクト抽出 37ext_lib: 38 ar x /usr/lib/libncurses.a --output $(LIB_OBJ_DIR) 39 40# プロジェクトクリーン 41clean_pro: 42 rm -f ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d $(PRG) $(OBJ)/*.o 43 44# ライブラリクリーン 45clean_lib: 46 rm -f ./$(LIB) ./$(LIB_OBJ_DIR)/*.o ./$(LIB_DEP_DIR)/*.d 47 48# すべてクリーン 49clean: 50 rm -f ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d $(PRG) $(OBJ)/*.o 51 rm -f ./$(LIB) ./$(LIB_OBJ_DIR)/*.o ./$(LIB_DEP_DIR)/*.d 52 53# すべて実行 54all: 55 make ext_lib 56 make 57

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

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

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

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

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

y_waiwai

2022/08/17 11:17

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、よけいな省略翻訳しないで出たそのママをコピペで提示してください
drednote

2022/08/17 18:02

利用部のcppをビルドするのは以前作成したもののmakefile? cppのファイル名が書いてないからmakefileが実際何makeしてるのかもわからないし。 ただ、もし「以前作成したもの」のmakefileで利用部cppをビルドしてるんだったら、 SDLGame.aがリンクされてなくない?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問