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

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

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

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

makefile

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

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

C++

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

Q&A

2回答

911閲覧

エラーメッセージを解決したいです。

haharuru

総合スコア4

make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

makefile

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

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

C++

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

0グッド

0クリップ

投稿2021/06/04 08:36

前提・実現したいこと

エラーメッセージを解決したいです。
makeをしたときに以下のようなエラーが発生しました。
Makefile.gnuという名前で使用しています。
C++とFortranを使用しています。何か不備がありましたらご教授願いたいです。

発生している問題・エラーメッセージ

///実行コマンド/// make -f Makefile.gnu ///エラーメッセージ/// c++ -g -L/home/ee174039/ドキュメント/SDFlib/sample/../usr/local/sphere/lib -o sdfTest sdfTest.o -lSDF -lgfortran /home/ee174039/ドキュメント/SDFlib/sample/../usr/local/sphere/lib/libSDF.a(sdfReinit3d.o): 関数 `reinit3d_eno2_' 内: sdfReinit3d.F:(.text+0x15b): `_gfortran_allocate64_array' に対する定義されていない参照です sdfReinit3d.F:(.text+0x2ba): `_gfortran_deallocate' に対する定義されていない参照です sdfReinit3d.F:(.text+0x2d4): `_gfortran_deallocate' に対する定義されていない参照です /home/ee174039/ドキュメント/SDFlib/sample/../usr/local/sphere/lib/libSDF.a(sdfReinit3d.o): 関数 `reinit3d_weno_' 内: sdfReinit3d.F:(.text+0x1442): `_gfortran_allocate64_array' に対する定義されていない参照です sdfReinit3d.F:(.text+0x1505): `_gfortran_allocate64_array' に対する定義されていない参照です sdfReinit3d.F:(.text+0x15d6): `_gfortran_allocate64_array' に対する定義されていない参照です sdfReinit3d.F:(.text+0x34f5): `_gfortran_deallocate' に対する定義されていない参照です sdfReinit3d.F:(.text+0x3504): `_gfortran_deallocate' に対する定義されていない参照です sdfReinit3d.F:(.text+0x3513): `_gfortran_deallocate' に対する定義されていない参照です sdfReinit3d.F:(.text+0x352d): `_gfortran_deallocate' に対する定義されていない参照です sdfReinit3d.F:(.text+0x3547): `_gfortran_deallocate' に対する定義されていない参照です /home/ee174039/ドキュメント/SDFlib/sample/../usr/local/sphere/lib/libSDF.a(sdfReinit3d.o):sdfReinit3d.F:(.text+0x3561): `_gfortran_deallocate' に対する定義されていない参照がさらに続いています /home/ee174039/ドキュメント/SDFlib/sample/../usr/local/sphere/lib/libSDF.a(sdfReinit3d.o): 関数 `sdf_reinit3d_eno2_' 内: sdfReinit3d.F:(.text+0x388e): `_gfortran_allocate64_array' に対する定義されていない参照です sdfReinit3d.F:(.text+0x3af6): `_gfortran_deallocate' に対する定義されていない参照です sdfReinit3d.F:(.text+0x3b10): `_gfortran_deallocate' に対する定義されていない参照です /home/ee174039/ドキュメント/SDFlib/sample/../usr/local/sphere/lib/libSDF.a(sdfReinit3d.o): 関数 `sdf_reinit3d_weno_' 内: sdfReinit3d.F:(.text+0x3c2e): `_gfortran_allocate64_array' に対する定義されていない参照です sdfReinit3d.F:(.text+0x3e96): `_gfortran_deallocate' に対する定義されていない参照です sdfReinit3d.F:(.text+0x3eb0): `_gfortran_deallocate' に対する定義されていない参照です

Makefile.gnuのソースコード

# # Makefile for SDFlib sample # HAVE_FC=yes # override 'G' to optimize G = -g # override 'PREFIX' to specify your installed dir PREFIX = $(PWD)/../usr/local/sphere SDFDIR = $(PREFIX) PROGS = sdfTest CXX = c++ CXXFLAGS = $(G) -I$(SDFDIR)/include/sdf LD = $(CXX) LDFLAGS = $(G) -L$(SDFDIR)/lib LDLIBS = -lSDF FC = gfortran FFLAGS = $(G) -I$(SDFDIR)/include/sdf LDF = $(FC) LDFLAGSF = $(G) -L$(SDFDIR)/lib LDLIBSF = -lSDF -lm -lstdc++ ifeq ($(HAVE_FC),yes) LDLIBS += -lgfortran PROGS += fortTest endif TARGET = $(PROGS) all : $(TARGET) sdfTest : sdfTest.o $(LD) $(LDFLAGS) -o $@ $< $(LDLIBS) fortTest : fortTest.o $(LDF) $(LDFLAGS) -o $@ $< $(LDLIBSF) clean: $(RM) *.o test_out* distclean: clean $(RM) $(PROGS)

試したこと

Makefileについて学びました。

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

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

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

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

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

itagagaki

2021/06/04 08:58 編集

これリンク時のエラーですね。 make -f Makefile.gnu clean してから make -f Makefile.gnu しても同じ結果になりますか?
haharuru

2021/06/06 04:33

返答ありがとうございます。 そのようにコンパイルをしても同じような結果になります。
guest

回答2

0

依存関係の記述が正しいという前提での推測です。

$(LDLIBS)-lSDF -lgfortranとなっていますが、1番目のlibSDF.aから、おそらく2番目のlibgfortran.aに含まれているのであろう_gfortran_*が参照されており、リンカc++がこれを解決できなかったようです。
リンカに指定する順番とリンカの能力次第で、そのような事は起こり得ます。

そこで、$(LDLIBS)の順番を変えてみましょう。

Makefile

1LDLIBS = 2 3ifeq ($(HAVE_FC),yes) 4 LDLIBS += -lgfortran 5 PROGS += fortTest 6endif 7 8LDLIBS += -lSDF

これは、エラーメッセージで「定義されていない参照です」となっているというシンボルがlibgfortran.aに確かに含まれているというのが前提です。それを確かめるには

sh

1objdump -t <path>/libgfortran.a

で知ることができます。

投稿2021/06/07 14:22

itagagaki

総合スコア8402

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

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

haharuru

2021/06/08 05:26

勉強不足で非常に申し訳ないのですが、 1番目、2番目のというのはどこを見てのことですか? ご教授お願いします。
itagagaki

2021/06/08 05:31

LDLIBS = -lSDF と LDLIBS += -lgfortran の結果、LDLIBSは -lSDF -lgfortran になっていますね。この1番目の -lSDF と、2番目の -lgfortran を入れ替えて -lgfortran -lSDF となるようにしたらどうでしょうか?という意味です。
haharuru

2021/06/08 05:54

ご丁寧に返信ありがとうございます。 実際に順番を入れ替えてみたところ、同じようなエラーメッセージが出ました。 objdunp -t libSDF.a を実行してみたところ、 0000000000000000 g F .text 0000000000000047 sw_ 0000000000000050 g F .text 00000000000012a8 reinit3d_eno2_ 0000000000000000 *UND* 0000000000000000 _gfortran_allocate64_array 0000000000000000 *UND* 0000000000000000 _gfortran_deallocate 0000000000001300 g F .text 0000000000002485 reinit3d_weno_ 0000000000003790 g F .text 000000000000039d sdf_reinit3d_eno2_ 0000000000003b30 g F .text 000000000000039d sdf_reinit3d_weno_ が表示されました。これはやはり_gfortran_allocate64_arrayなどの場所がないということでしょうか。
itagagaki

2021/06/08 06:38

libSDF.a の中で _gfortran_allocate64_array が参照されているけど、その実体は libSDF.a の中には無い、ということです。 ではどこにあるのかというと、私は libgfortran.a の中にあるのだろうと思っているのですが、 objdump -t libgfortran.a の結果はどうですか? libgfortran.a の場所はどこなのかわかりませんが、どこにありますか? たとえば仮に /usr/lib にあるとすれば、objdump -t /usr/lib/libgfortran.a ですね。 あ、もしかしたら、ですが、その場所もリンカへの -L オプション(LDFLAGS)で指定してあげる必要があるかもしれませんね。
haharuru

2021/06/09 01:13

-Lオプションと言うのは具体的に、 ifeq ($(HAVE_FC),yes) LDLIBS += -lgfortran PROGS += fortTest endif の中に、 ifeq ($(HAVE_FC),yes) LDLIBS += -lgfortran LDFFLAGS+=。。。。。  PROGS += fortTest endif 。。。。。の部分を指定するということでしょうか。
itagagaki

2021/06/09 01:17

そうです。ただLDFFLAGSではなくLDFLAGSですね。
haharuru

2021/06/09 01:25

間違いのご指摘ありがとうございます。 LDFLAGS += -lgfortran あるいは LDFLAGS += -lSDF で試してみます。ご丁寧にありがとうございます。勉強になりました。
itagagaki

2021/06/09 01:28

あ、違います。LDFLAGSで指定するのは -L オプション(大文字)で、これはライブラリファイルのあるディレクトリを指定します。LDLIBS で指定する -l オプション(小文字)と間違わないでください。小文字の -l オプションはライブラリのファイル名を指定するもので、大文字の -L オプションは、それが存在するディレクトリパスを指定するものです。
haharuru

2021/06/09 01:39

早速のご指摘ありがとうございます。 確認なのですが、具体的に、ーLオプションを指定するディレクトリパスはlibgfortran.aが入っている場所であり、またlibgfortran.aファイルがそこにあることが前提ということでよろしいでしょうか? また、僕自身がネットで調べた情報によると、CPUによってLDFLAGSの内容を変えなくてはいけないと書いてありました。自身が使っているCPUはintelです。CPUのディレクトリパス指定をまず試したいと思います。 またご連絡させてください。よろしくお願いします。
haharuru

2021/06/25 05:46 編集

お世話になっております。 以前お話させていただいた、 LDLIBS = $(path) ifeq ($(HAVE_FC),yes) LDLIBS += -lgfortran PROGS += fortTest endif LDLIBS += -lSDF ↑このような書き方をしても同じようなエラーが出てきます。また、LDLIBSの順番を変えても同じです。 objdumpで、libSDF.aとlibgfortran.aの中身は同じになっていました。
guest

0

エラーメッセージのとおりで、その出ているキーワードが存在しないと言ってます
ライブラリが不足しているのかソースファイルが不足してるのか、そこらへんでしょうね

投稿2021/06/04 09:06

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問