0

次の問題だけでなく、CMake で理解しなければならないことがたくさんありますが、これはまだ解決できない最初の最も単純な問題です。私はインターウェブを精査し、友人から「Mastering CMake」の本を借りさえしましたが、私はまだ最も苦労しています... CMake、Fortran、MinGW、さらには組み合わせに関して、オンラインで多くのものが存在します一度に2つ。しかし、この 3 つを合わせると、ほとんど存在しないように見えます。

(この時点で) 私がやりたいことは、MinGW の gfortran コンパイラを使用して、Windows で CMake を使用してビルドおよびコンパイルする単純な Fortran プログラムを取得することだけです。

...そして、私は CMake n00b です。

これは私がこれまで取り組んできたことです:

CMakeLists.txt:

project(cmake_test Fortran)
add_executable(testf test.f90)

test.f90:

      program test
      write(*,*)"hello world"
      endprogram test

私は MinGW の MSYS2 バージョンを持っています。これは、私が最終的にコンパイルしようとしているコードが Windows でコンパイルされる唯一のバージョンだからです。(つまり、MSYS2 シェルで独自の Makefile を使用してコンパイルすると、コンパイルされます。)

Windows パスに が追加されてい;C:\msys64\mingw64\binます。(私も試しましたが、他の問題の中でも特に、同じディレクトリにいる;C:\msys64\usr\binことに不満があります。)sh.exe

次に、CMake-GUI をポップして開き、上記の CMakeLists をロードし、Configure をクリックして、プロジェクトのジェネレーターを「MinGW Makefiles」に指定し、「Use default native compilers」を選択して、次の出力を取得します。

The Fortran compiler identification is GNU 5.4.0
Check for working Fortran compiler: C:/msys64/mingw64/bin/gfortran.exe
Check for working Fortran compiler: C:/msys64/mingw64/bin/gfortran.exe  -- works
Detecting Fortran compiler ABI info
Detecting Fortran compiler ABI info - done
Checking whether C:/msys64/mingw64/bin/gfortran.exe supports Fortran 90
Checking whether C:/msys64/mingw64/bin/gfortran.exe supports Fortran 90 -- yes
Configuring done

次に、[構成] をもう一度クリックすると、次のようになります。

Configuring done

次に生成します。

Generating done

私のビルド ディレクトリには、Makefile とその他の多くのファイルとディレクトリがあります。

MSYS2 シェルで make を実行しようとすると、次のようになります。

myself@COMPUTER MSYS /c/users/myself/desktop/dll_test/with_fortran_cmake/build
$ make
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\users\myself\desktop\dll_test\with_fortran_cmake\build>

最後の行はプロンプトです。もう一度実行するようmakeに入力すると、プロンプト内でプロンプトが再び表示されます。Ctrl+C を押すと、それが強制終了され、通常の MSYS2 プロンプトに戻ります。

したがって、CMakeの部分を正しく行っていると仮定しても、実際にそれを作成する方法を理解できません。

質問: リストした制約を考慮して、このサンプル コードをビルド/コンパイル/実行するにはどうすればよいですか?

(私が実際にやりたいのは、この部分を過ぎたら、Visual Studio 13 で動作するようにすることです。これは、CMake で構築されている C++ プロジェクトがあるためです (ほとんどの場合、質問へのアクセスが制限されている他の誰かによって書かれています)。 Visual Studio から C++ で呼び出すことができる何らかのライブラリに Fortran を入れると、Fortran はビルド済みのライブラリとしてそのままにしておくことができます。 VS から Fortran を編集する可能性があまりないことは知っていますし、それを行うことに興味もありません。)

生成されたコンテンツの内容は次のとおりですMakefile(ここにコピーしたときにエディターがタブをスペースに置き換えたことに注意してください)。

# CMAKE generated file: DO NOT EDIT!
# Generated by "MinGW Makefiles" Generator, CMake Version 3.5

# Default target executed when no arguments are given to make.
default_target: all

.PHONY : default_target

# Allow only one "make -f Makefile2" at a time, but pass parallelism.
.NOTPARALLEL:


#=============================================================================
# Special targets provided by cmake.

# Disable implicit rules so canonical targets will work.
.SUFFIXES:


# Remove some rules from gmake that .SUFFIXES does not remove.
SUFFIXES =

.SUFFIXES: .hpux_make_needs_suffix_list


# Suppress display of executed commands.
$(VERBOSE).SILENT:


# A target that is always out of date.
cmake_force:

.PHONY : cmake_force

#=============================================================================
# Set environment variables for the build.

SHELL = cmd.exe

# The CMake executable.
CMAKE_COMMAND = "C:\Program Files (x86)\CMake\bin\cmake.exe"

# The command to remove a file.
RM = "C:\Program Files (x86)\CMake\bin\cmake.exe" -E remove -f

# Escaping for special characters.
EQUALS = =

# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = C:\Users\myself\Desktop\dll_test\with_fortran_cmake

# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = C:\Users\myself\Desktop\dll_test\with_fortran_cmake\build

#=============================================================================
# Targets provided globally by CMake.

# Special rule for the target edit_cache
edit_cache:
    @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..."
    "C:\Program Files (x86)\CMake\bin\cmake-gui.exe" -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : edit_cache

# Special rule for the target edit_cache
edit_cache/fast: edit_cache

.PHONY : edit_cache/fast

# Special rule for the target rebuild_cache
rebuild_cache:
    @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
    "C:\Program Files (x86)\CMake\bin\cmake.exe" -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache

# Special rule for the target rebuild_cache
rebuild_cache/fast: rebuild_cache

.PHONY : rebuild_cache/fast

# The main all target
all: cmake_check_build_system
    $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\myself\Desktop\dll_test\with_fortran_cmake\build\CMakeFiles C:\Users\myself\Desktop\dll_test\with_fortran_cmake\build\CMakeFiles\progress.marks
    $(MAKE) -f CMakeFiles\Makefile2 all
    $(CMAKE_COMMAND) -E cmake_progress_start C:\Users\myself\Desktop\dll_test\with_fortran_cmake\build\CMakeFiles 0
.PHONY : all

# The main clean target
clean:
    $(MAKE) -f CMakeFiles\Makefile2 clean
.PHONY : clean

# The main clean target
clean/fast: clean

.PHONY : clean/fast

# Prepare targets for installation.
preinstall: all
    $(MAKE) -f CMakeFiles\Makefile2 preinstall
.PHONY : preinstall

# Prepare targets for installation.
preinstall/fast:
    $(MAKE) -f CMakeFiles\Makefile2 preinstall
.PHONY : preinstall/fast

# clear depends
depend:
    $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles\Makefile.cmake 1
.PHONY : depend

#=============================================================================
# Target rules for targets named testf

# Build rule for target.
testf: cmake_check_build_system
    $(MAKE) -f CMakeFiles\Makefile2 testf
.PHONY : testf

# fast build rule for target.
testf/fast:
    $(MAKE) -f CMakeFiles\testf.dir\build.make CMakeFiles/testf.dir/build
.PHONY : testf/fast

test.obj: test.f90.obj

.PHONY : test.obj

# target to build an object file
test.f90.obj:
    $(MAKE) -f CMakeFiles\testf.dir\build.make CMakeFiles/testf.dir/test.f90.obj
.PHONY : test.f90.obj

test.i: test.f90.i

.PHONY : test.i

# target to preprocess a source file
test.f90.i:
    $(MAKE) -f CMakeFiles\testf.dir\build.make CMakeFiles/testf.dir/test.f90.i
.PHONY : test.f90.i

test.s: test.f90.s

.PHONY : test.s

# target to generate assembly for a file
test.f90.s:
    $(MAKE) -f CMakeFiles\testf.dir\build.make CMakeFiles/testf.dir/test.f90.s
.PHONY : test.f90.s

# Help Target
help:
    @echo The following are some of the valid targets for this Makefile:
    @echo ... all (the default if no target is provided)
    @echo ... clean
    @echo ... depend
    @echo ... testf
    @echo ... edit_cache
    @echo ... rebuild_cache
    @echo ... test.obj
    @echo ... test.i
    @echo ... test.s
.PHONY : help



#=============================================================================
# Special targets to cleanup operation of make.

# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
    $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles\Makefile.cmake 0
.PHONY : cmake_check_build_system

バージョン情報:

  • GNU Fortran (GCC) 5.3.0
  • Windows 7 エンタープライズ
  • Cmake 3.5.2
  • MSYS2 - このバージョンの確認方法がわかりません
  • MinGW - このバージョンの見つけ方がわからない

私は検索中にオンラインでさまざまなページを調べてきましたが、それらすべてを追跡することを気にしませんでしたが、特にこれは、タイトルから非常に関連しているように思われるため、常に出くわすものです.実際の問題と解決策はまったく異なります。

4

2 に答える 2

3

これは、MSYS2、cmake、make、および gfortran を使用して Fortran プログラムを構築する方法を示す簡単なシェル セッションです。私が行ったのと同じコマンドを実行してみて、異なる出力が得られるかどうかを確認してから、理由を調査してください。

MSYSTEM 変数は特に重要です。MSYS2 を起動するときにクリックするショートカットによって決まります。

$ echo $MSYSTEM
MINGW64

$ which cmake
/mingw64/bin/cmake

$ which gfortran
/mingw64/bin/gfortran

$ which make
/usr/bin/make

$ ls
CMakeLists.txt  test.f90

$ cat CMakeLists.txt
project(cmake_test Fortran)
add_executable(testf test.f90)

$ cat test.f90
      program test
      write(*,*)"hello world"
      endprogram test

$ mkdir build && cd build

$ cmake -G"MSYS Makefiles" ..
-- The Fortran compiler identification is GNU 6.2.0
-- Check for working Fortran compiler: D:/msys64/mingw64/bin/gfortran.exe
-- Check for working Fortran compiler: D:/msys64/mingw64/bin/gfortran.exe  -- works
-- Detecting Fortran compiler ABI info
-- Detecting Fortran compiler ABI info - done
-- Checking whether D:/msys64/mingw64/bin/gfortran.exe supports Fortran 90
-- Checking whether D:/msys64/mingw64/bin/gfortran.exe supports Fortran 90 -- yes
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/david/Documents/scraps/test_fortran/build

$ make
Scanning dependencies of target testf
[ 50%] Building Fortran object CMakeFiles/testf.dir/test.f90.obj
[100%] Linking Fortran executable testf.exe
[100%] Built target testf

$ ./testf.exe
 hello world
于 2016-09-28T14:59:46.613 に答える
0

編集:ここに実用的な解決策があります-最後まで読んでください!

元の質問に対する David Grayson のコメントのおかげで、部分的な解決策が見つかりました。gfortran の代わりに f95 を使用するため、「部分的」です。他の人にとってはうまくいくかもしれないので投稿しています.gfortranで動作させる方法がわかれば、更新します.

主な問題は非常に単純な間違いであることが判明しました。「MSYS Makefiles」の代わりに「MinGW Makefiles」を使用していました。

ただし、それを変更しただけで、[構成] をクリックすると、CMake-GUI で次の出力が得られました。

CMake Error: CMake was unable to find a build program corresponding to "MSYS Makefiles". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
CMake Error: CMake was unable to find a build program corresponding to "MSYS Makefiles". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
CMake Error: CMAKE_Fortran_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_AR was not found, please set to archive program. Configuring incomplete, errors occurred!

これを修正するために、Windows パスを再度変更しました。を使ってい;C:\msys64\mingw64\binたので、 に切り替えました;C:\msys64\usr\bin

その後、これは機能しました ([構成] をもう一度クリックし、[生成] をクリックmakeして、ディレクトリの MSYS2 ターミナル経由で実行しました/build) が、次の出力でわかるように、gfortran の代わりに f95 が使用されました。

The Fortran compiler identification is GNU 5.3.0
Check for working Fortran compiler: C:/msys64/usr/bin/f95.exe
Check for working Fortran compiler: C:/msys64/usr/bin/f95.exe  -- works
Detecting Fortran compiler ABI info
Detecting Fortran compiler ABI info - done
Checking whether C:/msys64/usr/bin/f95.exe supports Fortran 90
Checking whether C:/msys64/usr/bin/f95.exe supports Fortran 90 -- yes
Configuring done

私はまだ gfortran を使用できるように取り組んでおり、解決できたらこのソリューションを更新します。

編集:

わかりました、これは明らかにハックであり、より良い解決策があると確信しています。私は別の名前に変更C:\msys64\usr\bin\f95.exeしました(MSYS2がgfortranを見つける前に別のFortranコンパイラとして見つけないように)。また、CMake のキャッシュをクリアして再起動する必要がありました。しかし、今では動作します:

The Fortran compiler identification is GNU 5.3.0
Check for working Fortran compiler: C:/msys64/usr/bin/gfortran.exe
Check for working Fortran compiler: C:/msys64/usr/bin/gfortran.exe  -- works
Detecting Fortran compiler ABI info
Detecting Fortran compiler ABI info - done
Checking whether C:/msys64/usr/bin/gfortran.exe supports Fortran 90
Checking whether C:/msys64/usr/bin/gfortran.exe supports Fortran 90 -- yes
Configuring done

これを「正しい」方法で行う方法を考え出すことに取り組んでいます。

編集:

わかりました、これがより適切な方法だと思います。そこからCMakeを呼び出すときに、コマンドラインで環境変数を設定するのと本質的に同じことをすると思います。

CMake-GUI では、前に説明したようにすべてを設定しましたが、初めて [構成] をクリックする前に、小さなプラス記号が付いた [エントリの追加] ボタンをクリックしました。次に、2 つの新しいキャッシュ エントリを設定しますが、実際に必要なのは 1 つだけです。

Name: CMAKE_Fortran_COMPILER
Type: FILEPATH
Value: C:\msys64\usr\bin\gfortran.exe

以下も設定しましたが、これは、以下の出力に見られるように、gfortran が適切に呼び出されていることを確認するためだけのものでした。

Name: CMAKE_VERBOSE_MAKEFILE
Type: BOOL
Value: [True]

次に、makeMSYS2 ターミナルで実行すると、次の結果が得られました。

$ make
"/C/Program Files (x86)/CMake/bin/cmake.exe" -H/C/Users/myself/Desktop/dll_test/with_fortran_cmake -B/C/Users/myself/Desktop/dll_test/with_fortran_cmake/build --check-build-system CMakeFiles/Makefile.cmake 0
"/C/Program Files (x86)/CMake/bin/cmake.exe" -E cmake_progress_start /C/Users/myself/Desktop/dll_test/with_fortran_cmake/build/CMakeFiles /C/Users/myself/Desktop/dll_test/with_fortran_cmake/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/c/Users/myself/Desktop/dll_test/with_fortran_cmake/build'
make -f CMakeFiles/testf.dir/build.make CMakeFiles/testf.dir/depend
make[2]: Entering directory '/c/Users/myself/Desktop/dll_test/with_fortran_cmake/build'
"/C/Program Files (x86)/CMake/bin/cmake.exe" -E cmake_depends "MSYS Makefiles" /C/Users/myself/Desktop/dll_test/with_fortran_cmake /C/Users/myself/Desktop/dll_test/with_fortran_cmake /C/Users/myself/Desktop/dll_test/with_fortran_cmake/build /C/Users/myself/Desktop/dll_test/with_fortran_cmake/build /C/Users/myself/Desktop/dll_test/with_fortran_cmake/build/CMakeFiles/testf.dir/DependInfo.cmake --color=
Scanning dependencies of target testf
make[2]: Leaving directory '/c/Users/myself/Desktop/dll_test/with_fortran_cmake/build'
make -f CMakeFiles/testf.dir/build.make CMakeFiles/testf.dir/requires
make[2]: Entering directory '/c/Users/myself/Desktop/dll_test/with_fortran_cmake/build'
make[2]: Nothing to be done for 'CMakeFiles/testf.dir/requires'.
make[2]: Leaving directory '/c/Users/myself/Desktop/dll_test/with_fortran_cmake/build'
make -f CMakeFiles/testf.dir/build.make CMakeFiles/testf.dir/build
make[2]: Entering directory '/c/Users/myself/Desktop/dll_test/with_fortran_cmake/build'
[ 50%] Building Fortran object CMakeFiles/testf.dir/test.f90.obj
/C/msys64/usr/bin/gfortran.exe     -c /C/Users/myself/Desktop/dll_test/with_fortran_cmake/test.f90 -o CMakeFiles/testf.dir/test.f90.obj
[100%] Linking Fortran executable testf.exe
"/C/Program Files (x86)/CMake/bin/cmake.exe" -E remove -f CMakeFiles/testf.dir/objects.a
/C/msys64/usr/bin/ar.exe cr CMakeFiles/testf.dir/objects.a @CMakeFiles/testf.dir/objects1.rsp
/C/msys64/usr/bin/gfortran.exe     -Wl,--whole-archive CMakeFiles/testf.dir/objects.a -Wl,--no-whole-archive  -o testf.exe -Wl,--out-implib,libtestf.dll.a -Wl,--major-image-version,0,--minor-image-version,0
make[2]: Leaving directory '/c/Users/myself/Desktop/dll_test/with_fortran_cmake/build'
[100%] Built target testf
make[1]: Leaving directory '/c/Users/myself/Desktop/dll_test/with_fortran_cmake/build'
"/C/Program Files (x86)/CMake/bin/cmake.exe" -E cmake_progress_start /C/Users/myself/Desktop/dll_test/with_fortran_cmake/build/CMakeFiles 0

結果として得られるプログラムは、MSYS2 ターミナルと Windows コマンド プロンプトの両方で動作します。

...ここで、Visual Studio で C++ を使用してこれをすべて取得する方法を理解する必要があります。その他の SO の質問にご期待ください。:D

于 2016-09-28T15:16:52.850 に答える