我在app
文件夹
app/
|-- Main.hs
|-- SomeFunc2.hs
SomeFunc2.hs
只是打印不同的字符串
module SomeFunc2 where
import Lib
main :: IO ()
main = putStrLn "someFunc2"
当我在package.yaml
中定义多个可执行文件时,就像这样
executables:
multiexes-exe:
main: Main.hs
source-dirs: app
ghc-options:
- -threaded
- -rtsopts
- -with-rtsopts=-N
dependencies:
- multiexes
somefunc2-exe:
main: SomeFunc2.hs
source-dirs: app
ghc-options:
- -threaded
- -rtsopts
- -with-rtsopts=-N
dependencies:
- multiexes
我收到了错误:
▸ stack build
Building all executables for `multiexes' once. After a successful build of all of them, only specified executables will be rebuilt.
multiexes-0.1.0.0: configure (lib + exe)
Configuring multiexes-0.1.0.0...
multiexes-0.1.0.0: build (lib + exe)
Preprocessing library for multiexes-0.1.0.0..
Building library for multiexes-0.1.0.0..
[2 of 2] Compiling Lib ( src/Lib.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/Lib.o )
Preprocessing executable 'multiexes-exe' for multiexes-0.1.0.0..
Building executable 'multiexes-exe' for multiexes-0.1.0.0..
[1 of 3] Compiling Main ( app/Main.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/multiexes-exe/multiexes-exe-tmp/Main.o ) [Lib changed]
[3 of 3] Compiling SomeFunc2 ( app/SomeFunc2.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/multiexes-exe/multiexes-exe-tmp/SomeFunc2.o )
Linking .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/multiexes-exe/multiexes-exe ...
Preprocessing executable 'somefunc2-exe' for multiexes-0.1.0.0..
Building executable 'somefunc2-exe' for multiexes-0.1.0.0..
Warning: Enabling workaround for Main module 'Main' listed in 'other-modules'
illegaly!
[1 of 2] Compiling Paths_multiexes ( .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/somefunc2-exe/autogen/Paths_multiexes.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/somefunc2-exe/somefunc2-exe-tmp/Paths_multiexes.o )
[2 of 2] Compiling SomeFunc2 ( app/SomeFunc2.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/somefunc2-exe/somefunc2-exe-tmp/SomeFunc2.o )
<no location info>: error:
output was redirected with -o, but no output will be generated
because there is no Main module.
-- While building custom Setup.hs for package multiexes-0.1.0.0 using:
/Users/leo/.stack/setup-exe-cache/x86_64-osx/Cabal-simple_mPHDZzAJ_2.0.1.0_ghc-8.2.2 --builddir=.stack-work/dist/x86_64-osx/Cabal-2.0.1.0 build lib:multiexes exe:multiexes-exe exe:somefunc2-exe --ghc-options " -ddump-hi -ddump-to-file -fdiagnostics-color=always"
Process exited with code: ExitFailure 1
如何解决?谢谢!
答案 0 :(得分:4)
找到一个解决方案,如果我为每个可执行文件创建一个文件夹并在每个文件夹中都有一个Main.hs
,那么它就可以了。
app/
|-- Main.hs
somefunc2/
|-- Main.hs
在package.yaml中,将source-dirs更改为这些文件夹:
executables:
multiexes-exe:
main: Main.hs
source-dirs: app
ghc-options:
- -threaded
- -rtsopts
- -with-rtsopts=-N
dependencies:
- multiexes
somefunc2-exe:
main: Main.hs
source-dirs: somefunc2
ghc-options:
- -threaded
- -rtsopts
- -with-rtsopts=-N
dependencies:
- multiexes
答案 1 :(得分:1)
包含main函数并且应该成为可执行文件的模块必须命名为Main
,如
module Main (main) where
您也可以完全省略模块声明以达到同样的效果。你的问题在
module SomeFunc2 where
此约定在the Haskell report中指定,而GHC allows to change the module name包含main
,Cabal does not。
引用上一个链接:
此外,虽然文件的名称可能 变化,模块本身必须命名为
Main
。
因此,在这种情况下,即使文件本身未被调用Main
,也可以命名模块Main.hs
(或省略模块名称声明)。