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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

make

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

makefile

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

FORTRAN

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

Q&A

1回答

1170閲覧

makefile windows エラーの原因を教えて下さい

yu_my

総合スコア1

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

make

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

makefile

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

FORTRAN

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

0グッド

0クリップ

投稿2022/06/10 08:23

  • 前提

makeを使って複数あるFortranソースコードをビルドしようとしています.
OceanWave3Dhttps://github.com/apengsigkarup/OceanWave3D-Fortran90というオープンソースコードに入っているmakefileなのですが,UnixやLinux環境で作られているためWindows用に書き換える作業を行っています.

treeの情報(一部抜粋)は以下の通りです.srcの各フォルダの中にソースコード(.f90)やインクルードファイル(makefile.inc)が入っています

C:. ├─build ├─GUI │ ├─MainWindow │ …… ├─src │ ├─analyticalsolutions │ ├─curvilinear │ ……

実現したいこと

オブジェクトファイルを作成させてエラーを解消する.
自分なりに調べた結果,ターゲットReleaseを実行するのに必要なオブジェクトファイル(.o)が作成されていないので,下記のエラーが出ているのだと推測しています.ただ,makefileの下部に以下のパターンルール?が記述されています。 必要な依存ファイルがない場合,makeは依存ファイルを作成するために,このパターンルールに飛び,オブジェクトファイルを作成するものだと思っていますが,なぜエラー終了となるのでしょうか…

# Generic compilation rules … $(BUILDDIR)\%.o: %.f90   @if ls *.mod &> \dev\null; then \ mv -v *.mod $(BUILDDIR); \ cp -v thirdpartylibs\LIB_VTK_IO\static\lib_vtk_io.mod $(BUILDDIR); \ fi $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS)

違う理由であれば解消方法をご教授下さい.

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

C:\Users\A\Desktop\OceanWave3D-Fortran90-master>make Release makefile:141: 警告: ターゲット `C:\Users\A\Desktop\OceanWave3D-Fortran90-master\build%.o' へのコマンドを置き換えます makefile:134: 警告: ターゲット `C:\Users\A\Desktop\OceanWave3D-Fortran90-master\build%.o' への古いコマンドは無視されます makefile:147: 警告: ターゲット `C:\Users\A\Desktop\OceanWave3D-Fortran90-master\build%.mod' へのコマンドを置き換えます makefile:144: 警告: ターゲット `C:\Users\A\Desktop\OceanWave3D-Fortran90-master\build%.mod' への古いコマンドは無視されます make: *** `Release' に必要なターゲット `C:\Users\A\Desktop\OceanWave3D-Fortran90-master\build\precision.o' を make するルールがありません. 中止.

該当のソースコード

インクルードファイル(common.mk)の内容

# For inclusion in makefile for use with GNU make (gmake) # # Purpose: Modify to local configuration by user. # # Program name PROGNAME = OceanWave3D LIBNAME = libOceanWave3D_botp.so # 追加 $(PWD)などの変数がWindows環境では認識されないため HOME=C:\Users\A\Desktop\OceanWave3D-Fortran90-master # Installation directory INSTALLDIR = $(HOME)\bin LIBINSTALLDIR = $(HOME)\lib # Build directory where object files are stored # BUILDDIR = $(PWD)\build BUILDDIR = $(HOME)\build # The build environment is set either by the choice of a compiler # flag, or by creating a block for a specific $USER. # Choose the Fortran compiler on this system # E.g. pathf90, f90, gfortran, gf90, ifort FC = gfortran #FC = gfortran44 #FC = gfortran-4.4 #FC = gf90 USER = hbb # First the blocks based on compiler name: … ifeq ($(FC),gfortran) # MacOS, apek LIBDIRS = -L $(HOME)\lib\ # -L\Users\apek\Documents\Fortran\Harwell\lib -L\usr\local\atlas\lib -L\Users\apek\Documents\Fortran\SPARSKIT2 # LINLIB = -lharwell -lskit -latlas -llapack -l_VTK_IO # LINLIB = -lharwell -lskit -latlas -l_VTK_IO -framework veclib LINLIB = -lharwell -lskit -latlas -framework veclib DBFLAGS = -pg -g -O -fcheck=all -ffpe-trap=invalid,zero,overflow OPTFLAGS = -O2 endif … # Then the blocks for specific users (this clobbers the above info.) ifeq ($(USER),hbb) # hbb machine, gfortran FC=gfortran LIBDIRS = -L $(HOME)\lib\ LINLIB = -lharwell -lskit -llapack -lblas DBFLAGS = -pg -g -fbounds-check -ffpe-trap=invalid,zero,overflow -ffree-line-length-none -fno-automatic OPTFLAGS = -pg -O3 -ffree-line-length-none -fno-automatic -ffpe-trap=invalid,zero,overflow # OPTFLAGS = -g -fast endif …

makefileの内容

# makefile for use with GNU make (gmake) # # Author: Allan P. Engsig-Karup. # include common.mk .SUFFIXES: .f90 .f # Source files # subdirectories - complete directory-tree should be included # # Perhaps use perl script sfmakedepend in the future for dependency list? SOURCES := include src\variabledefs\makefile.inc include src\utilities\makefile.inc include src\analyticalsolutions\makefile.inc include src\curvilinear\makefile.inc include src\fft\makefile.inc include src\functions\makefile.inc include src\multigrid\makefile.inc include src\pressure\makefile.inc include src\timeintegration\makefile.inc include src\wrappers\makefile.inc include src\initialization\makefile.inc include src\IO\makefile.inc include src\main\makefile.inc include src\iterative\makefile.inc include src\OpenFoam\makefile.inc # Search paths for source dependencies VPATH = src\variabledefs VPATH += src\analyticalsolutions VPATH += src\variabledefs VPATH += src\analyticalsolutions VPATH += src\curvilinear VPATH += src\fft VPATH += src\functions VPATH += src\initialization VPATH += src\IO VPATH += src\main VPATH += src\multigrid VPATH += src\pressure VPATH += src\timeintegration VPATH += src\utilities VPATH += src\wrappers VPATH += src\iterative VPATH += src\OpenFoam VPATH += src\OpenFoam\IO VPATH += src\OpenFoam\OpenFoam VPATH += $(BUILDDIR) # Include directories INCLUDEDIRS += -I$(BUILDDIR) # Object files OBJECTS := $(SOURCES:.f=.o) OBJECTS := $(OBJECTS:.f90=.o) #OBJECTS := $(OBJECTS:.f=.o) OBJECTSNODIR = $(notdir $(OBJECTS)) OBJECTSBUILDDIR = $(addprefix $(BUILDDIR)\,$(OBJECTSNODIR)) # #test: $(OBJECTSBUILDDIR) # @echo $(OBJECTSBUILDDIR) # default target creates directory #default: # -@mkdir -p -v $(BUILDDIR) # @echo "To install OceanWave3D type 'make Debug|Release'" default: @if not exist $(BUILDDIR) mkdir $(BUILDDIR) @echo "To install OceanWave3D type 'make Debug|Release'" # Targets for linking Release: FFLAGS = $(OPTFLAGS) Release: $(OBJECTSBUILDDIR) @if ls *.mod &> \dev\null; then \ mv -v .\*.mod $(BUILDDIR); \ cp -v .\thirdpartylibs\LIB_VTK_IO\static\lib_vtk_io.mod $(BUILDDIR); \ fi @echo "*** Starting linking of files for OceanWave3D (Release)... ***" @$(FC) $(FFLAGS) -o $(INSTALLDIR)\$(PROGNAME) $(OBJECTSBUILDDIR) $(LIBDIRS) $(LINLIB) $(INCLUDEDIRS) @echo "OceanWave3D has been built successfully." Debug: FFLAGS = $(DBFLAGS) Debug: $(OBJECTSBUILDDIR) @if ls *.mod &> \dev\null; then \ mv -v *.mod $(BUILDDIR); \ cp -v thirdpartylibs\LIB_VTK_IO\static\lib_vtk_io.mod $(BUILDDIR); \ fi @echo "*** Starting linking of files for OceanWave3D (Debug)... ***" $(FC) $(FFLAGS) -o $(INSTALLDIR)\$(PROGNAME) $(OBJECTSBUILDDIR) $(LIBDIRS) $(LINLIB) $(INCLUDEDIRS) all: Release sharedLib: FFLAGS = $(SHLIBFLAGS) sharedLib: $(OBJECTSBUILDDIR) @if ls *.mod &> \dev\null; then \ mv -v .\*.mod $(BUILDDIR); \ cp -v .\thirdpartylibs\LIB_VTK_IO\static\lib_vtk_io.mod $(BUILDDIR); \ fi @echo "*** Starting linking of files for OceanWave3D (Release)... ***" @$(FC) $(FFLAGS) -o $(FOAM_USER_LIBBIN)\$(LIBNAME) $(OBJECTSBUILDDIR) $(LIBDIRS) $(LINLIB) $(INCLUDEDIRS) @echo "Shared library for OceanWave3D has been built successfully." # Compile only - compile all source file to build directory compile: $(OBJECTSBUILDDIR) clean: # rm -f $(BUILDDIR)\*.o # rm -f $(BUILDDIR)\*.mod # rm -f $(INSTALLDIR)\$(PROGNAME) del $(BUILDDIR)\*.o del $(BUILDDIR)\*.mod del $(INSTALLDIR)\$(PROGNAME) # # Special source dependencies # # For defining generic rules: # # $@ - The current target's full name. # $* - The current target's file name without a suffix. # $? - A list of the current target's changed dependencies. # $< - A single changed dependency of the current target. # Generic compilation rules $(BUILDDIR)\%.o: %.f $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) $(BUILDDIR)\%.o: %.f90 @if ls *.mod &> \dev\null; then \ mv -v *.mod $(BUILDDIR); \ cp -v thirdpartylibs\LIB_VTK_IO\static\lib_vtk_io.mod $(BUILDDIR); \ fi $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) $(BUILDDIR)\%.mod: %.f $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) $(BUILDDIR)\%.mod: %.f90 $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) # / を \ に変更する前 #$(BUILDDIR)/%.o: %.f # $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) #$(BUILDDIR)/%.o: %.f90 # @if ls *.mod &> /dev/null; then \ mv -v *.mod $(BUILDDIR); \ cp -v thirdpartylibs/LIB_VTK_IO/static/lib_vtk_io.mod $(BUILDDIR); \ fi # $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) #$(BUILDDIR)/%.mod: %.f # $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS) #$(BUILDDIR)/%.mod: %.f90 # $(FC) $(FFLAGS) -c $< -o $@ $(INCLUDEDIRS)

試したこと

  • common.mkとmakefileにおいて/をバックスラッシュ\に変更

結果下記の警告が表示されるようになるが,ファイルの場所は示せるようになった.
makefile:141: 警告: ターゲット `C:\Users\A\Desktop\OceanWave3D-Fortran90-master\build%.o' へのコマンドを置き換えます
\build%.oの間に\が表示されないのはなぜでしょう…これもエラーの原因でしょうか?

  • rmや$(PWD)などWindows環境で認識されないコマンドや変数を修正(元のコードはコメントアウト表示#)
  • コマンドプロンプトにmakeと打ち込む
  • To install OceanWave3D type 'make Debug|Release とコマンドプロンプトに表示されbuildフォルダがカレントディレクトリに作成される
  • make Releaseと打ち込むと上記のエラーが出現しコンパイル作業が中止される

補足情報(FW/ツールのバージョンなど)

  • PC OS:Windows 10 Home
  • CPU:Intel(R) Core(TM) i9-9900K
  • コンパイラ:gfortran
  • Make: GNU Make

これ以上は自分で解決できそうにありません.ご教授よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/06/10 09:10

WSL2でUbuntuを動かしたら、そんなに苦労しないような気がします。Windows上でやるのはあまりに環境が違いすぎて。
yu_my

2022/06/11 12:46

WSL2を使用する方法に切り替えます.Windowsしか使ってこなかったもので,こんなサービスが今はあるのですね.貴重な情報ありがとうございました.
guest

回答1

0

\ (バックスラッシュ)が場所によってエスケープ文字として解釈されるからです。

Windows では / もパス区切り文字として使用できるので、
パス区切り文字は / のままにしておいて Windows 対応の修正を行うのがよいです。

投稿2022/06/13 04:09

chirimen

総合スコア189

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問