スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門基本編落穂拾い その33 コマンドプロンプトからのコンパイル(1)

F#のコンパイラ本体はfsc.exeというファイルです。今回は直接これを使って、コンパイルする方法を紹介します。まずこのファイルの場所ですが、デフォルトでVisual Studio 2010をインストールした場合は、
c:\Program Files\Microsoft Microsoft F#\v4.0中に関連のアセンブリと一緒に入っています。
よって、コマンドプロンプトからfsc.exeを実行するには、このフォルダに移動して実行する(非推奨)か、このフォルダへのパスを等しておく(推奨)必要があります。
パスの通し方はhttp://www.xucker.jpn.org/pc/vistaenvset.htmlなどを参照してください。
 
ちなみに私のPCのpath変数は
c:\ruby186\bin;C:\Perl\bin;中略;C:\Program Files\QuickTime\QTSystem\;c:\Program Files\Microsoft F#\v4.0\
という感じになりました。
それでは「すべてのプログラム」>「アクセサリ」>「コマンドプロンプト」でコマンドプロンプトを開いてみてください。fsc+リターンで
 
Microsoft (R) F# 2.0 Compiler build 4.0.30128.1
Copyright (c) Microsoft Corporation. All Rights Reserved.
 
error FS0207: No inputs specified
 
と表示されればパスを通すことに成功です。
それでは、ファイルの保存場所のフォルダを作っておいて、その場所にエディタで拡張子がfsのソースファイルを作ってみましょう。ちなみに私はc:\Users\T_GYOUTEN\FSharp\Proj001というフォルダを作り、その中に次のファイルを作ってみました。
 
ファイル名 myProg0001.fs 文字コードはUTF-8
 
内容(タブは使わずスペースでインシデントすること)
 
[<EntryPoint>]
let main (args : string[]) = //strign[]に引数が格納される
    
    if args.Length <> 1 then
        printfn "引数の個数は1個です" 
    else
        printfn "Hello %s さん" args.[0]
    System.Console.ReadLine() |> ignore
   
    0 // 正常終了を示す値0を返す
    
ディレクトリc:\Users\T_GYOUTEN\FSharp\Proj001に移動して、
(移動についはhttp://cmd-pro.com/com_00.htmlhttp://cmd-pro.com/m_long.htmlを参照してください。ちなみにhttp://cmd-pro.com/postmail.htmlはコマンドプロンプトについてとても参考になるサイトです。)
fsc myProg0001.fsと入力してリターンキーを押します。
すると次のように表示されます。
 
C:\Users\T_GYOUTEN\FSharp\Proj001>fsc myProg0001.fs
Microsoft (R) F# 2.0 Compiler build 4.0.30128.1
Copyright (c) Microsoft Corporation. All Rights Reserved.
 
フォルダ内部を見てみると
 
2010/03/31  12:32             4,608 myProg0001.exe
2010/03/31  12:32               292 myProg0001.fs
2010/03/31  12:28               297 myProg0001.txt
 
というようにmyProg0001.exeファイルが出来上がっています。
実行してみます。
 
C:\Users\T_GYOUTEN\FSharp\Proj001>myProg0001.exe Guest
Hello Guest さん
 
ということでfsc ファイル名.fs でEXEファイルができあがります。
つぎはdllファイルをつくってみます。
 
ファイル名 myLib001.fs 文字コードはUTF-8
 
内容(タブは使わずスペースでインシデントすること)
 
module myLib001
 
type myType001(v:int) =
    member this.V = v
 
let myAve (x:myType001) (y:myType001) =
    x.V+y.V
    
それではコンパイルしてみます。
 
C:\Users\T_GYOUTEN\FSharp\Proj001>fsc myLib001.fs --target:library
Microsoft (R) F# 2.0 Compiler build 4.0.30128.1
Copyright (c) Microsoft Corporation. All Rights Reserved.
 
これでmyLib001.dllファイルが作成されました。
このように--target:libraryを指定すればdllファイルが作成されます。
--target:exeを指定すればexeファイルですが、上でやったようにこれは省略可能です。
 
次は上のmyLib001.fsを利用したexeファイルを作ってみます。
上のmyProg0001.fsの内容を次のように変更します。
(ファイル内容)
[<EntryPoint>]
let main (args : string[]) = //strign[]に引数が格納される
    
    let x = new myLib001.myType001(1) //このmyLib001はファイル名ではなくモジュール名
    let y = new myLib001.myType001(2)
    let sum = myLib001.myAve x y
    printfn "%d" sum
    System.Console.ReadLine() |> ignore
    0 // 正常終了を示す値0を返す
 
コンパイルすると次のようなエラーに見舞われます。
myProg0001.fs(5,17): error FS0039: The namespace or module 'MyLib001' is not defined
 
これは参照設定ができていないからで、次のようにコンパイルのオプションで参照設定してコンパイルします。(-r:ファイル名)です。
 
C:\Users\T_GYOUTEN\FSharp\Proj001>fsc myProg0001.fs -r:myLib001.dll
 
Microsoft (R) F# 2.0 Compiler build 4.0.30128.1
Copyright (c) Microsoft Corporation. All Rights Reserved.
 
EXEファイルが出来上がったので実行してみます。
C:\Users\T_GYOUTEN\FSharp\Proj001>myProg0001.exe
3
 
なお、これはmyProg0001.exe内にmyLib001.dllの内容が取り込まれたわけではなく、プログラム実行の過程でmyLib001.dllの内容を読み込む形で実行されているので、同一フォルダにmyLib001.dllがなければエラーとなります。exeファイルだけで実行可能にするには--standaloneオプションを付けてコンパイルします。
 
C:\Users\T_GYOUTEN\FSharp\Proj001>fsc myProg0001.fs -r:myLib001.dll --standalone
 
Microsoft (R) F# 2.0 Compiler build 4.0.30128.1
Copyright (c) Microsoft Corporation. All Rights Reserved.
 
これで、EXEファイルだけで実行可能なプログラムが作成できました。
 
実は、F#の実行には、FSharp.Core.dllというアセンブリが必要なのですが、、F#がインストールされたマシンでは、このアセンブリをデフォルトで参照する形になっています。よって、そのような状況になっていないマシンでEXEファイルを実行さすには、FSharp.Core.dllを一緒に配布するか、上でやったように--standalone属性をつけてコンパイルする必要があります。
 
なおその他のオプションはfsc --helpとすることで見ることができます。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。