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

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

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

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

makefile

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

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

ビルド

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

Q&A

解決済

1回答

2454閲覧

Makefile 静的ライブラリをリンクすると定義されていませんと表示される原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

makefile

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

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

ビルド

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

0グッド

0クリップ

投稿2021/11/07 04:57

編集2021/11/07 08:23

提示コードですがFrameWorkとGame二つのプロジェクトがありその内のFrameWorkのobjファイルを.aファイル出力してそれをGameプロジェクトでリンクして使いたいのですが以下のエラー出ます。これはなぜでしょうか? どうやってライブラリを参照するのでしょうか?

環境

CentOS GUI

端末
$ make ar rcs FrameWork.a FrameWork/obj/Render.o FrameWork/obj/Shape.o FrameWork/obj/Sprite.o FrameWork/obj/Transform.o FrameWork/obj/Camera.o FrameWork/obj/Init.o FrameWork/obj/Resource.o FrameWork/obj/Text.o FrameWork/obj/Shader.o FrameWork/obj/Model.o FrameWork/obj/Simple.o FrameWork/obj/Help.o FrameWork/obj/Window.o g++ -lrt Game/obj/Scene.o Game/obj/Entry.o Game/obj/Game.o Game/obj/Camera.o Game/obj/Main.o Game/obj/LightCube.o Game/obj/Player.o Game/obj/Actor.o Game/obj/Ground.o -o TopViewAction -ldl -lGLESv2 -lassimp -L/usr/local/lib -lGLU -lGL -lglfw3 -pthread -lGL -lGLEW -lfreetype -lX11 -L -lFrameWork.a Game/obj/Camera.o: 関数 `Camera::Update()' 内: Camera.cpp:(.text+0x11b): `FrameWork::Camera::setLook(glm::vec<3, float, (glm::qualifier)0>)' に対する定義されていない参照です Camera.cpp:(.text+0x136): `FrameWork::Camera::setPosition(glm::vec<3, float, (glm::qualifier)0>)' に対する定義されていない参照です Game/obj/Main.o: 関数 `main' 内: Main.cpp:(.text+0x49): `FrameWork::Init(glm::vec<2, int, (glm::qualifier)0>, glm::vec<2, int, (glm::qualifier)0>, char const*)' に対する定義されていない参照です

参考サイト: https://www.yunabe.jp/docs/static_library.html
参考サイト2: https://www.yokoweb.net/dokuwiki/programing/c-language/gcc-programing/gcc-library-link-order

Makefile
PRG :=TopViewAction STATIC_LIB :=FrameWork.a FRAMEWORK_SRC_DIR :=FrameWork/source/ GAME_SRC_DIR :=Game/source/ FRAMEWORK_OBJ_DIR :=FrameWork/obj GAME_OBJ_DIR :=Game/obj FRAMEWORK_DEP_DIR :=$(FRAMEWORK_OBJ_DIR) GAME_DEP_DIR :=$(GAME_OBJ_DIR) FRAMEWORK_SRC :=$(wildcard $(FRAMEWORK_SRC_DIR)/*.cpp) GAME_SRC :=$(wildcard $(GAME_SRC_DIR)/*.cpp) FRAMEWORK_OBJ :=$(addprefix $(FRAMEWORK_OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(FRAMEWORK_SRC)))) GAME_OBJ :=$(addprefix $(GAME_OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(GAME_SRC)))) FRAMEWORK_DEP :=$(wildcard $(FRAMEWORK_DEP_DIR)/*.d) GAME_DEP :=$(wildcard $(GAME_DEP_DIR)/*.d) $(PRG): $(GAME_OBJ) $(CXX) $^ -o $@ -ldl -lGLESv2 -lassimp -L/usr/local/lib -lGLU -lGL -lglfw3 -pthread -lGL -lGLEW -lfreetype -lX11 -L -l$(STATIC_LIB) $(STATIC_LIB): $(FRAMEWORK_OBJ) ar rc $@ $^ $(FRAMEWORK_OBJ_DIR)/%.o: FrameWork/source/%.cpp $(CXX) -std=c++2a -I/usr/local/include/freetype2 -I/usr/local/include/glm -I/usr/include/libpng16 -I/usr/local/include -pthread -c -MMD -MP $< -o $@ -include $(FRAMEWORK_DEP) $(GAME_OBJ_DIR)/%.o: Game/source/%.cpp $(CXX) -std=c++2a -I/usr/local/include/freetype2 -I/usr/local/include/glm -I/usr/include/libpng16 -I/usr/local/include -pthread -c -MMD -MP $< -o $@ -include $(GAME_DEP) clean: rm -f ./$(FRAMEWORK_OBJ_DIR)/*.o *.out ./$(FRAMEWORK_OBJ_DIR)/*.d *.a $(STATIC_LIB) rm -f ./$(GAME_OBJ_DIR)/*.o *.out ./$(GAME_OBJ_DIR)/*.d *.a $(PRG)

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

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

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

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

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

melian

2021/11/07 06:39

-L -l$(STATIC_LIB) を -Wl,-Bstatic -L. -l$(STATIC_LIB) に変更するとどうなるでしょうか?
退会済みユーザー

退会済みユーザー

2021/11/07 06:43

はい、以下のエラーがでます。 $ make ar rcs FrameWork.a FrameWork/obj/Render.o FrameWork/obj/Shape.o FrameWork/obj/Sprite.o FrameWork/obj/Transform.o FrameWork/obj/Camera.o FrameWork/obj/Init.o FrameWork/obj/Resource.o FrameWork/obj/Text.o FrameWork/obj/Shader.o FrameWork/obj/Model.o FrameWork/obj/Simple.o FrameWork/obj/Help.o FrameWork/obj/Window.o g++ Game/obj/Scene.o Game/obj/Entry.o Game/obj/Game.o Game/obj/Camera.o Game/obj/Main.o Game/obj/LightCube.o Game/obj/Player.o Game/obj/Actor.o Game/obj/Ground.o -o TopViewAction -ldl -lGLESv2 -lassimp -L/usr/local/lib -lGLU -lGL -lglfw3 -pthread -lGL -lGLEW -lfreetype -lX11 -Wl,-Bstatic -L. -lFrameWork.a /usr/bin/ld: -lFrameWork.a が見つかりません /usr/bin/ld: -lstdc++ が見つかりません /usr/bin/ld: -lm が見つかりません /usr/bin/ld: -lgcc_s が見つかりません /usr/bin/ld: -lpthread が見つかりません /usr/bin/ld: -lc が見つかりません /usr/bin/ld: -lgcc_s が見つかりません collect2: エラー: ld はステータス 1 で終了しました make: *** [Makefile:28: TopViewAction] エラー 1
melian

2021/11/07 06:58

どうやら dynamic link も明示的に指定する必要がありそうなので、全体を以下の様に書き換えてみるとどうなるでしょう? $(CXX) $^ -o $@ -Wl,-Bdynamic -lrt -ldl -lGLESv2 -lassimp -L/usr/local/lib -lGLU -lGL -lglfw3 -pthread -lGL -lGLEW -lfreetype -lX11 -Wl,-Bstatic -L. -l$(STATIC_LIB)
退会済みユーザー

退会済みユーザー

2021/11/07 07:00

はい。しかし以下のエラーが出ます。 「 [shigurechan@localhost TopViewGame]$ make ar rcs FrameWork.a FrameWork/obj/Render.o FrameWork/obj/Shape.o FrameWork/obj/Sprite.o FrameWork/obj/Transform.o FrameWork/obj/Camera.o FrameWork/obj/Init.o FrameWork/obj/Resource.o FrameWork/obj/Text.o FrameWork/obj/Shader.o FrameWork/obj/Model.o FrameWork/obj/Simple.o FrameWork/obj/Help.o FrameWork/obj/Window.o g++ Game/obj/Scene.o Game/obj/Entry.o Game/obj/Game.o Game/obj/Camera.o Game/obj/Main.o Game/obj/LightCube.o Game/obj/Player.o Game/obj/Actor.o Game/obj/Ground.o -o TopViewAction -Wl,-Bdynamic -lrt -ldl -lGLESv2 -lassimp -L/usr/local/lib -lGLU -lGL -lglfw3 -pthread -lGL -lGLEW -lfreetype -lX11 -Wl,-Bstatic -L. -lFrameWork.a /usr/bin/ld: -lFrameWork.a が見つかりません /usr/bin/ld: -lstdc++ が見つかりません /usr/bin/ld: -lm が見つかりません /usr/bin/ld: -lgcc_s が見つかりません /usr/bin/ld: -lpthread が見つかりません /usr/bin/ld: -lc が見つかりません /usr/bin/ld: -lgcc_s が見つかりません collect2: エラー: ld はステータス 1 で終了しました make: *** [Makefile:25: TopViewAction] エラー 1 [shigurechan@localhost TopViewGame]$ 」
melian

2021/11/07 07:02

判りました、手間を取らせてしまいましてどうも済みません。
guest

回答1

0

ベストアンサー

順序が原因でした。 下記の参考サイトの文章ですが依存している方を前に,依存されている方を後に置く部に従いました。

参考サイト: https://gist.github.com/akirakiron/4729600

C++で静的ライブラリをリンクする時の引数の順番で詰まったのでメモ. ライブラリ間に依存関係がある場合には,依存している方を前に,依存されている方を後に置く. そうしないと'undefined reference'エラーになる. arコマンドで一つのライブラリにまとめる際は,引数の順番は気にする必要はない.
$(PRG): $(GAME_OBJ) $(CXX) $^ -o $@ -ldl -lGLESv2 -lassimp -L -l $(STATIC_LIB) -L/usr/local/lib -lGLU -lGL -lglfw3 -pthread -lGL -lGLEW -lfreetype -lX11

投稿2021/11/07 08:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問