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

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

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

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

FORTRAN

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

Q&A

解決済

1回答

1811閲覧

gfortranで関数が見つからないというundefined symbols ...エラーが出ます。

nishiys

総合スコア33

GCC

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

FORTRAN

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

0グッド

0クリップ

投稿2017/10/24 19:07

編集2017/10/24 19:41

下記のstl_reshape.f90, calc_deformation.f90を用いたmain.f90を

gfortran calc_deformation.f90 stl_reshape.f90 main.f90 -o main.exec

とgfortranでコンパイルすると

Undefined symbols for architecture x86_64:
"calcdeform", referenced from:
___stl_reshape_MOD_calcstl in ccfyAJdE.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

というようなエラーが出ます。
-cオプションでコンパイルのみ行うときはエラーが出ないので、リンク時にエラーが出ているのだと思うのですが、
エラーをなくすにはどうしたら良いでしょうか?

エラーが出るのは関数だけで、subroutineの方は問題ないようです。

------------------------------- main.f90 -------------------------------------
program main
use stl_reshape
implicit none
...

call calcSTL
end program main


--------------------------------- stl_reshape.f90 ------------------------------
module stl_reshape
use calc_deformation

implicit none

private
public :: calcSTL

contains

...

subroutine calcSTL
double precision calcDeform
...

do i=1,num_vertex vertex_arr(1,3,i) = calcDeform(vertex_arr(1,2,i)) vertex_arr(2,3,i) = calcDeform(vertex_arr(2,2,i)) vertex_arr(3,3,i) = calcDeform(vertex_arr(3,2,i)) enddo ...

end subroutine calcSTL
end module stl_reshape


--------------------------------- calc_deformation.f90 --------------------------
module calc_deformation
implicit none
private
public :: calcDeform

contains

function calcDeform(y)
double precision, intent(in) :: y
double precision calcDeform

calcDeform = y**2

end function calcDeform

end module calc_deformation


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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。直接の回答ではないこと、ご了承ください。

コードが一部、省略されていて同じエラーが再現しないのですが、public :: calcDeformが外部シンボルとして正しく認識されていないように思えます。

calcSTL サブルーチンで calcDeform関数が呼ばれているものの、同時に同じ名前でcalcDeform変数が宣言されてもいるので、混乱があったりするのではないでしょうか。

double precision calcDeform

vertex_arr関数(?)がどのような定義になっているか分からないですが、コードをもう少し提示すれば良い回答がいただけるかもしれません。

投稿2017/10/26 03:13

dodox86

総合スコア9183

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

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

nishiys

2017/10/29 07:11

関数の定義の仕方を function calcDerfom(y) return (w) のようにすることで解決できました。 もしかすると配列を引数に取り、配列を返す関数はこちらの定義の仕方でないとダメなのか(ただループ内に入れているので、普通の変数を引数にとって普通の変数で返しているので違うかも知れませんが、、)、関数の型宣言のところでおかしなことが起こっていたのかも知れません。 いずれにせよ、解決のヒントになりました。ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問