2013-01-09 71 views
16

用下面的項目結構:生產從單個項目的多個可執行文件

src/FirstExecutable.hs 
src/SecondExecutable.hs 
my-amazing-project.cabal 

和下面的小集團設置:

name:    my-amazing-project 
version:   0.1.0.0 
build-type:   Simple 
cabal-version:  >=1.8 

executable first-executable 
    hs-source-dirs: src 
    main-is:   FirstExecutable.hs 
    ghc-options:  -O2 -threaded -with-rtsopts=-N 
    build-depends: base == 4.5.* 

executable second-executable 
    hs-source-dirs: src 
    main-is:   SecondExecutable.hs 
    ghc-options:  -O2 -threaded -with-rtsopts=-N 
    build-depends: base == 4.5.* 

運行cabal install失敗,並輸出如下:

Installing executable(s) in 
/Users/mojojojo/Library/Haskell/ghc-7.4.2/lib/my-amazing-project-0.1.0.0/bin 
cabal: dist/build/second-executable/second-executable: does not exist 
Failed to install my-amazing-project-0.1.0.0 
cabal: Error: some packages failed to install: 
my-amazing-project-0.1.0.0 failed during the final install step. The exception 
was: 
ExitFailure 1 

我做錯了什麼,或者這是一個Cabal錯誤?是


所述可執行模塊的內容如下:

module FirstExecutable where 

main = putStrLn "Running FirstExecutable" 

module SecondExecutable where 

main = putStrLn "Running SecondExecutable" 
+0

它適用於我。 – Satvik

+0

@Satvik我剛剛發現瞭解決方案。發佈它 –

+2

你不應該在可執行文件中使用'module ..'。或者你可以使用'模塊主' – Satvik

回答

19

小集團預計可執行的模塊是Main。您應該跳過模塊行或使用module Main where

好的,這裏是可能的原因。當您實際編譯程序時,如果模塊不是Main,則不會生成haskell程序的可執行文件。運行可執行文件時使用Main模塊的main功能。 ghc可能的解決方法是-main-is標誌。所以你可以像

name:    my-amazing-project 
version:   0.1.0.0 
build-type:   Simple 
cabal-version:  >=1.8 

executable first-executable 
    hs-source-dirs: src 
    main-is:   FirstExecutable.hs 
    ghc-options:  -O2 -threaded -with-rtsopts=-N -main-is FirstExecutable 
    build-depends: base == 4.5.* 

executable second-executable 
    hs-source-dirs: src 
    main-is:   SecondExecutable.hs 
    ghc-options:  -O2 -threaded -with-rtsopts=-N -main-is SecondExecutable 
    build-depends: base == 4.5.* 
+1

是的,這正是我花了幾個小時在谷歌上搜索並毆打自己後意外發現的。坦率地說,我很沮喪,他們爲什麼選擇這樣一個混亂的行爲。一個糟糕的設計決定IMO –

+4

@NikitaVolkov此行爲由[語言標準](http://www.haskell.org/onlinereport/modules.html)強制執行 - 「Haskell程序是模塊的集合,其中之一,按慣例,必須稱爲Main,並且必須輸出價值主體。「 –

+0

@NikitaVolkov你可以在更新的答案中看到我建議的可能的解決方法。 – Satvik

相關問題