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

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

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

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

makefile

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

FORTRAN

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

Q&A

解決済

1回答

1188閲覧

Makefile.gnuをコンパイラするときのエラーを解決したいです。

haharuru

総合スコア4

make

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

makefile

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

FORTRAN

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

0グッド

0クリップ

投稿2021/06/29 03:38

編集2021/06/29 03:39

前提・実現したいこと

プログラムの初心者です。
現在Makefile.gnuをMakeしたいのですが、以下のエラーが出ます。
C++のコードとfortranのコードを使用しており、プログラムでエラーが発生しています。
このエラーの解決を行いたいです。
以前リンクでのエラーとのご指摘がありましたが、まだわかりませんでした。
このエラーに対する原因として考えられるものは何があるでしょうか。
ご回答よろしくお願いします。

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

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' に対する定義されていない参照です

###code model

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

試したこと

言語間結合について学習しました。

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

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

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

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

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

jbpb0

2021/06/29 04:07

情報が少なくて、よく分かりません OSは何でしょうか? c++とは、g++ですか? 質問のエラーメッセージは、makeのどの部分を実行してる時のものですか? Makefileを見ると、 ・sdfTest.? をコンパイルして sdfTest.o ができる ・sdfTest.o とライブラリ(-lSDF -lgfortranで指定)から、c++ を使って sdfTest ができる という過程を経るようですが、最後のところのエラーですか? -lSDF のライブラリファイル(libSDF.a かな?)は、自分でソースからコンパイルして作ったものですか? それとも、ライブラリファイルを入手して使っているのですか?
haharuru

2021/06/29 04:34 編集

返信ありがとうございます。 OSはCentOS6のLinuxを使用しています。 質問のエラーメッセージが、どこの部分指しているのかがわからないのが現状です。 リンクの部分でlibSDF.aを使用していますが、この中身はこちらです。↓ SYMBOL TABLE: 0000000000000000 l df *ABS* 0000000000000000 sdfReinit3d.F 0000000000000000 l d .text 0000000000000000 .text 0000000000000000 l d .data 0000000000000000 .data 0000000000000000 l d .bss 0000000000000000 .bss 0000000000000000 l d .rodata.cst4 0000000000000000 .rodata.cst4 0000000000000000 l d .eh_frame 0000000000000000 .eh_frame 0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack 0000000000000000 l .rodata.cst4 0000000000000000 .LC1 0000000000000004 l .rodata.cst4 0000000000000000 .LC2 0000000000000008 l .rodata.cst4 0000000000000000 .LC3 000000000000000c l .rodata.cst4 0000000000000000 .LC5 0000000000000014 l .rodata.cst4 0000000000000000 .LC8 0000000000000010 l .rodata.cst4 0000000000000000 .LC7 000000000000002c l .rodata.cst4 0000000000000000 .LC14 0000000000000024 l .rodata.cst4 0000000000000000 .LC12 0000000000000020 l .rodata.cst4 0000000000000000 .LC11 0000000000000030 l .rodata.cst4 0000000000000000 .LC15 0000000000000018 l .rodata.cst4 0000000000000000 .LC9 000000000000001c l .rodata.cst4 0000000000000000 .LC10 0000000000000028 l .rodata.cst4 0000000000000000 .LC13 0000000000000034 l .rodata.cst4 0000000000000000 .LC16 0000000000000038 l .rodata.cst4 0000000000000000 .LC17 000000000000003c l .rodata.cst4 0000000000000000 .LC18 0000000000000040 l .rodata.cst4 0000000000000000 .LC19 0000000000000044 l .rodata.cst4 0000000000000000 .LC20 0000000000000048 l .rodata.cst4 0000000000000000 .LC22 000000000000004c l .rodata.cst4 0000000000000000 .LC23 0000000000000000 l d .comment 0000000000000000 .comment 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_ 自分の予想では、 sdfTest : sdfTest.o $(LD) $(LDFLAGS) -o $@ $< $(LDLIBS) fortTest : fortTest.o $(LDF) $(LDFLAGSF) -o $@ $< $(LDLIBS) この部分でエラーが発生しているのではないかと考えています。
haharuru

2021/06/29 04:35

>c++とは、g++ですか? c++コンパイラを使用しているので、c++で間違えないと考えています。
jbpb0

2021/06/29 09:40 編集

> c++コンパイラを使用しているので、c++で間違えない c++ --version を実行したら、どうなりますか? > 質問のエラーメッセージが、どこの部分指しているのかがわからない sdfTest.o はありますか? fortTest.o はありますか? sdfTest.o のソースの言語は何ですか? sdfTest.拡張子 というファイルがあると思いますが、その拡張子は何ですか? たぶん、cpp, f あたりだと思いますが libSDF.a は、自分でソースからコンパイルして作ったものですか? それとも、ライブラリファイルを入手して使っている(他人が作った libSDF.a を使ってる)のですか?
jbpb0

2021/06/29 10:27 編集

もう一つ gfortran --version の結果も教えてください さらにもう一つ yum list installed | grep gfortran の結果も教えてください
jbpb0

2021/06/29 10:49 編集

https://teratail.com/questions/342174 で、itagagakiさんが 「objdump -t libgfortran.a の結果はどうですか?」 と聞いてますけど、答えてませんよね それ重要なのですが、やってみましたか? 【追記】 すみません 見落としてました 「objdumpで、libSDF.aとlibgfortran.aの中身は同じになっていました。」 って書いてましたね 上記の「同じになってました」というのは、 objdump -t libgfortran.a の結果も、 0000000000000000 *UND* 0000000000000000 _gfortran_allocate64_array 0000000000000000 *UND* 0000000000000000 _gfortran_deallocate と、未定義(UND)だったということでしょうか?
haharuru

2021/06/30 02:06 編集

お返事ありがとうございます。 コマンド:c++ --version c++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23) Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. コマンド:gfortran --version GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23) Copyright (C) 2010 Free Software Foundation, Inc. GNU Fortran comes with NO WARRANTY, to the extent permitted by law. You may redistribute copies of GNU Fortran under the terms of the GNU General Public License. For more information about these matters, see the file named COPYING コマンド:yum list installed | grep gfortran gcc-gfortran.x86_64 4.4.7-23.el6 @base libgfortran.x86_64 4.4.7-23.el6 @base/$releasever >sdfTest.o はありますか? >fortTest.o はありますか? 両方ともあります。 (追記) sdfTest.oに関しては所有権がrootになっていましたが、これは関係あるのでしょうか。 追記に関して: その通りです。未定義となっていました。 (追記) libSDF.aに関しては他人が作ったものを入手しています。 *今現在* 実行ファイルである、sdfTest.exeが不足していたため、それを追加したところ、定義が参照されて問題は解決しました。 ・・・・・・・・・・ また次の問題が出たので、新しく質問で出そうと考えている内容です。。 [root@localhost sample]# ./sdfTest ./sdfTest: error while loading shared libraries: libgfortran.so.1: cannot open shared object file: No such file or directory これはlibgfortran.soが不足しているということでしょうか、もしくはアクセスの権限がないということでしょうか。
jbpb0

2021/06/30 02:16

> sdfTest.exeが不足していたため、それを追加した 上記「sdfTest.exe」は、自分でコンパイルして作ったものではなく、他人が作ったものですか? それがあって使えるなら、そもそもmakeを行う必要がないですよね
jbpb0

2021/06/30 02:27 編集

> その通りです。未定義となっていました。 https://github.com/gcc-mirror/gcc/blob/master/libgfortran/ChangeLog-2007 に、下記の記述があります 2007-08-29 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> * runtime/memory.c (internal_realloc, allocate, allocate_array, deallocate): Remove functions. * gfortran.map (_gfortran_allocate, _gfortran_allocate_array, _gfortran_deallocate, _gfortran_internal_realloc): Remove symbols. * libgfortran.h (error_codes): Add comment. 2007-07-01 Janne Blomqvist <jb@gcc.gnu.org> * runtime/memory.c (internal_realloc): Use index_type for size argument instead of GFC_INTEGER_4. (allocate_array): Likewise. (allocate): Likewise, add ifdef around unnecessary check. (internal_reallo64): Remove. (allocate_array64): Remove. (allocate64): Remove. * gfortran.map: Remove symbols for 64-bit allocation functions. そこで、過去のバージョンの「runtime/memory.c」を調べました https://github.com/gcc-mirror/gcc/blob/releases/gcc-4.2.4/libgfortran/runtime/memory.c には allocate64_array, deallocate がありますが、 https://github.com/gcc-mirror/gcc/blob/releases/gcc-4.3.0/libgfortran/runtime/memory.c にはありません gcc 4.3.0以降のlibgfortranには allocate64_array, deallocate が入ってないようです > libgfortran.x86_64 4.4.7-23.el6 @base/$releasever 質問者さんがお使いのlibgfortranのバージョンは4.4.7で4.3.0以降ですから、allocate64_array, deallocate が無いので、リンク時に未定義になると思います > libSDF.aに関しては他人が作ったものを入手しています。 libSDF.a が allocate64_array, deallocate を必要とするのなら、それがコンパイルされた時に使われたlibgfortranが、gcc 4.3.0よりも前のバージョンのものだったのではないですかね
haharuru

2021/06/30 02:27

確かにかなり古いファイルです。 古いバージョンのコンパイラをインストールを試みてみます。 makeに関してもう少し学習を進めます。 ご教授ありがとうございました。
jbpb0

2021/06/30 02:32

対策は、おそらく下記のどれかでいけると思います ・libSDF.a を現在使ってるコンパイラで作り直す (ソースが必要ですが) ・gcc 4.3.0よりも前のバージョンを一式インストールして、libSDF.a を使う場合はそれを使う ・allocate64_array, deallocate が入っている過去のバージョンの「runtime/memory.c」から、必要な部分だけ取り出したC言語ソースファイルを作り、それをコンパイルした「*.o」ファイルも libSDF.a と一緒にリンクさせる
jbpb0

2021/06/30 02:48

> libgfortran.so.1: cannot open shared object file: No such file or directory おそらく、libgfortran.a があるところに、libgfortran.so がファイル名に付いてるファイルがあると思うので、それとのシンボリックリンクを libgfortran.so.1 というファイル名で作って、それを「sdfTest」が実行時に見つけられるように設定すれば、「No such file or directory」は出なくなると思います ただし、gcc 4.4.7の libgfortran.so* には、libgfortran.a と同様に allocate64_array, deallocate は入ってないはずなので、やはり未定義エラーになって実行できないと思います
haharuru

2021/06/30 02:56

対策に関する情報、誠にありがとうございます。 まずはgcc 4.3.0よりも前(gcc4.3.0を含む)のバージョンを一式インストールしようと思います。 ありがとうございました。
jbpb0

2021/06/30 03:00

> gcc 4.3.0よりも前(gcc4.3.0を含む)のバージョンを一式インストール 4.3.0はダメです それよりも前の
jbpb0

2021/06/30 03:04

あと、実質同じ内容の質問を何度も投稿するのは、よくないです 参考 https://teratail.com/help/avoid-asking の「過去に投稿した質問と同じ内容の質問」
guest

回答1

0

ベストアンサー

ChangeLog-2007 に、下記の記述があります

2007-08-29 Francois-Xavier Coudert fxcoudert@gcc.gnu.org

  • runtime/memory.c (internal_realloc, allocate, allocate_array,

deallocate): Remove functions.

  • gfortran.map (_gfortran_allocate, _gfortran_allocate_array,

_gfortran_deallocate, _gfortran_internal_realloc): Remove symbols.

  • libgfortran.h (error_codes): Add comment.

2007-07-01 Janne Blomqvist jb@gcc.gnu.org

  • runtime/memory.c (internal_realloc): Use index_type for size

argument instead of GFC_INTEGER_4.
(allocate_array): Likewise.
(allocate): Likewise, add ifdef around unnecessary check.
(internal_reallo64): Remove.
(allocate_array64): Remove.
(allocate64): Remove.

  • gfortran.map: Remove symbols for 64-bit allocation functions.

そこで、過去のバージョンの「runtime/memory.c」を調べました
gcc-4.2.4 には allocate64_array, deallocate がありますが、
gcc-4.3.0 にはありません

gcc 4.3.0以降のlibgfortranには allocate64_array, deallocate が入ってないようです

libgfortran.x86_64 4.4.7-23.el6 @base/$releasever

質問者さんがお使いのlibgfortranのバージョンは4.4.7で4.3.0以降ですから、allocate64_array, deallocate が無いので、リンク時に未定義になると思います

対策は、おそらく下記のどれかでいけると思います
・libSDF.a を現在使ってるコンパイラで作り直す (ソースが必要ですが)
・gcc 4.3.0よりも前のバージョンを一式インストールして、libSDF.a を使う場合はそれを使う
・allocate64_array, deallocate が入っている過去のバージョンの「runtime/memory.c」から、必要な部分だけ取り出したC言語ソースファイルを作り、それをコンパイルした「*.o」ファイルも libSDF.a と一緒にリンクさせる

投稿2021/07/02 09:24

jbpb0

総合スコア7651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問