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

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

新規登録して質問してみよう
ただいま回答率
85.35%
参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

makefile

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

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

C++

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

Q&A

2回答

3725閲覧

Makefile ライブラリを参照しても未定義の参照というエラーが出る原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

makefile

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

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

C++

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

0グッド

0クリップ

投稿2021/11/15 07:59

編集2021/12/04 07:46

提示コードのコマンドプロンプト部ですがライブラリをリンクすると大量の未定義の参照というエラーが出ます。なぜ未定義の参照というエラーエラー出るのでしょうか?makeifleはlibFramework.aを生成してそれをリンクする二つのプロジェクトあります。またmake clean コマンドを実行すると下記のエラーになります。これは何をしたのでしょうか?

#####試したこと
libFrameWork.aを生成するコード以外を全てコメントアウトして無理やり生成してリンクしましたが同じエラーがでます。

参考サイト: https://www.yunabe.jp/docs/static_library.html

環境

OS: windows10
コンパイラ: tdm64-gcc-10.3.0-2
利用ライブラリ
glfw
glew
opengl
glm
stb
freetype
assimp

現状

C:\TDM-GCC-64\x86_64-w64-mingw32ディレクトリ内のinclude , lib ディレクトリの該当のライブラリをコピー

make FrameWork.a
C:\Users\Matsuzawa ken\Desktop\TopViewGame>make libFrameWork.a make: `libFrameWork.a' is up to date.
コマンドプロンプト
C:\Users\yw325\Desktop\TopViewGame>make g++ Game/obj/Control.o Game/obj/Cube.o Game/obj/Entry.o Game/obj/Game.o Game/obj/Ground.o Game/obj/LightCube.o Game/obj/Main.o Game/obj/Player.o Game/obj/Scene.o -o program.exe -L -l FrameWork.lib -lglfw3 -lfreetype -lglew32 Warning: corrupt .drectve at end of def file Warning: corrupt .drectve at end of def file Warning: corrupt .drectve at end of def file C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: i386 architecture of input file `Game/obj/Scene.o' is incompatible with i386:x86-64 output C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Game/obj/Cube.o:Cube.cpp:(.text+0x43): undefined reference to `FrameWork::Shader::Shader()' C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Game/obj/Cube.o:Cube.cpp:(.text+0x55): undefined reference to `FrameWork::Shader::Shader()'
make clean
C:\Users\yw325\Desktop\TopViewGame>make clean rm -f ./FrameWork/obj/*.o *.out ./FrameWork/obj/*.d *.a libFrameWork.a process_begin: CreateProcess(NULL, rm -f ./FrameWork/obj/*.o *.out ./FrameWork/obj/*.d *.a libFrameWork.a, ...) failed. make (e=2): 指定されたファイルが見つかりません。 make: *** [clean] エラー 2 C:\Users\yw325\Desktop\TopViewGame>
-v
C:\Users\yw325\Desktop\TopViewGame>make g++ -v Game/obj/Control.o Game/obj/Cube.o Game/obj/Entry.o Game/obj/Game.o Game/obj/Ground.o Game/obj/LightCube.o Game/obj/Main.o Game/obj/Player.o Game/obj/Scene.o -o program.exe -L -lFrameWork -lglew32 -lglfw3 -lfreetype -lopengl32 gンン spec gpオト「ワキB COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=C:/TDM-GCC-64/bin/../libexec/gcc/x86_64-w64-mingw32/10.3.0/lto-wrapper.exe ^[Qbg: x86_64-w64-mingw32 configure ン: ../../../src/gcc-git-10.3.0/configure --build=x86_64-w64-mingw32 --enable-targets=all --enable-languages=ada,c,c++,fortran,jit,lto,objc,obj-c++ --enable-libgomp --enable-lto --enable-graphite --enable-cxx-flags=-DWINPTHREAD_STATIC --disable-build-with-cxx --disable-build-poststage1-with-cxx --enable-libstdcxx-debug --enable-threads=posix --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --disable-libstdcxx-pch --enable-libstdcxx-threads --enable-libstdcxx-time=yes --enable-mingw-wildcard --with-gnu-ld --disable-werror --enable-nls --disable-win32-registry --enable-large-address-aware --disable-rpath --disable-symvers --prefix=/mingw64tdm --with-local-prefix=/mingw64tdm --with-pkgversion=tdm64-1 --with-bugurl=https://github.com/jmeubank/tdm-gcc/issues Xbhf: posix T|[gウト「 LTO ウkASY€: zlib zstd gcc o[W 10.3.0 (tdm64-1) COMPILER_PATH=C:/TDM-GCC-64/bin/../libexec/gcc/x86_64-w64-mingw32/10.3.0/;C:/TDM-GCC-64/bin/../libexec/gcc/;C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/1

#####中身

C:\Users\yw325\Desktop\TopViewGame>ar t libFrameWork.a Actor.o Camera.o Help.o Init.o Model.o Render.o Resource.o Shader.o Shape.o Simple.o Sprite.o Text.o Transform.o Window.o C:\Users\yw325\Desktop\TopViewGame>
Makefile
PRG :=program.exe STATIC_LIB :=libFrameWork.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) $(STATIC_LIB) #$(CXX) $(GAME_OBJ) -o $@ -ldl -lGLESv2 -lassimp -L -l $(STATIC_LIB) -L/usr/local/lib -lGLU -lGL -lglfw3 -pthread -lGL -lGLEW -lfreetype -lX11 $(CXX) $(GAME_OBJ) -o $@ -L -lFrameWork -lglew32 -lglfw3 -lfreetype -lopengl32 $(STATIC_LIB): $(FRAMEWORK_OBJ) ar rc $@ $^ ranlib $@ $(FRAMEWORK_OBJ_DIR)/%.o: FrameWork/source/%.cpp $(CXX) -c -MMD -MP $< -o $@ -include $(FRAMEWORK_DEP) $(GAME_OBJ_DIR)/%.o: Game/source/%.cpp $(CXX) -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ページで確認できます。

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

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

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

int32_t

2021/11/16 00:15

> Framework.aも生成されません make clean した後に make FrameWork.a (STATIC_LIB が FrameWork.lib の場合は make FrameWork.lib) を実行したとき、画面にはなんと表示されますか?
退会済みユーザー

退会済みユーザー

2021/11/16 00:49

文章を修正しました。
int32_t

2021/11/19 16:23

ライブラリがビルドできるようになったんですか? 何が原因でした? リンクのコマンドラインに -v を付けてみてください($(CXX) -v $(GAME_OBJ) ...)。その出力で何かわかるかもしれません。
退会済みユーザー

退会済みユーザー

2021/11/20 03:55

.aファイルはすべてをコメントアウトしてそれだけを生成して無理やり行いました。 -vを入れて実行しましたが似たよなエラーが出て依然として同じです。
int32_t

2021/11/20 13:47

なるほど、何も解決してないのですね。 2つ前のコメントでも1つ前のコメントでも情報の開示をお願いしたんですが、開示してくれないので現状何もアドバイスはありません。
退会済みユーザー

退会済みユーザー

2021/11/21 09:14

文章を修正しました。
int32_t

2021/11/22 00:25

「make clean」の出力はどうでもいいので、「make libFrameWork.a」の出力を見たいです。 -v の出力はそれで全部ではないのでは。LIBRARY_PATH= とかリンカ起動コマンドラインが出ると思うのです。
退会済みユーザー

退会済みユーザー

2021/12/04 07:47

C:\Users\Matsuzawa ken\Desktop\TopViewGame>make libFrameWork.a make: `libFrameWork.a' is up to date. という表示が出ます。
int32_t

2021/12/06 04:48

libFrameWork.a を消してから make libFrameWork.a を実行した結果を見たいです。 私の回答に11月22日に追記した件は試しましたか?
退会済みユーザー

退会済みユーザー

2021/12/06 06:30

と表示されました。11月22日の回答は試しましたが同じでした。 C:\Users\Matsuzawa ken\Documents\TopViewGame>make libFrameWork.a ar rc libFrameWork.a FrameWork/obj/Actor.o FrameWork/obj/Camera.o FrameWork/obj/Help.o FrameWork/obj/Init.o FrameWork/obj/Model.o FrameWork/obj/Render.o FrameWork/obj/Resource.o FrameWork/obj/Shader.o FrameWork/obj/Shape.o FrameWork/obj/Simple.o FrameWork/obj/Sprite.o FrameWork/obj/Text.o FrameWork/obj/Transform.o FrameWork/obj/Window.o ranlib libFrameWork.a
guest

回答2

0

FrameWork.libはファイル名から推察するに、VisualStudio(cl.exe)用に作成されたライブラリファイルではないでしょうか?gcc系の場合はlibFrameWork.aというファイルを -lFrameWork で指定します。

投稿2021/11/15 11:39

Serbonis

総合スコア586

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

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

退会済みユーザー

退会済みユーザー

2021/11/15 11:43

として実行したのですが同じエラーが出ます。なぜでしょうか? [ STATIC_LIB :=libFrameWork.a $(CXX) $(GAME_OBJ) -o $@ -L -lglew32 -lglfw3 -lfreetype -L -lFrameWork ]
Serbonis

2021/11/15 11:49

無効な-Lオプションを削除して、FrameWorkの指定を一番最初に持って来たらどうなるか試してみてください。 -L -lglew32 -lglfw3 -lfreetype -L -lFrameWork ↓ -lFrameWork -lglew32 -lglfw3 -lfreetype
退会済みユーザー

退会済みユーザー

2021/11/15 11:51

「$(CXX) $(GAME_OBJ) -o $@ -lFrameWork -lglew32 -lglfw3 -lfreetype」 だとcan not find と出るので [$(CXX) $(GAME_OBJ) -o $@ -L -lFrameWork -lglew32 -lglfw3 -lfreetype] ようにしたのですが同じエラー出ます。 試したコード部より最小の環境にして行ったのですが同じエラーでした。
Serbonis

2021/11/15 12:08

libFrameWork.aの出自がわからないので何とも言えませんが、arコマンドやobjdumpコマンドでライブラリの内容を再確認されるとよいかも知れません。
退会済みユーザー

退会済みユーザー

2021/11/15 12:42

そもそもFrameWork.aが生成されないのでそれ以前なのでしょうか?
guest

0

Makefile

1STATIC_LIB :=FrameWork.lib 2... 3$(STATIC_LIB): $(FRAMEWORK_OBJ) 4 ar rc $@ $^

確証はないですが、Windows の *.lib 形式でないものに FrameWork.lib という名前を付けているのでリンカが混乱しているのではないでしょうか。ar で作るライブラリだったら名前は FrameWork.a にすべきです。


■ライブラリの指定が無視されているように見える問題について

-L -lFrameWork だと -lFrameWork-L の引数になっているかもしれません。-L. -lFrameWork にしてみてください。

投稿2021/11/15 08:10

編集2021/11/22 00:28
int32_t

総合スコア21695

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

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

退会済みユーザー

退会済みユーザー

2021/11/15 08:24

変更しましたが同じエラーが出ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問