Where do I find (and run) an executable compiled w

2019-08-01 04:19发布

问题:

I'm compiling my myProgram.lhs with the use of a cabal sandbox (set up with cabal sandbox init). I'm using a simplest approach I've come up with:

cabal exec -- ghc myProgram

or (having a rule in Makefile)

cabal exec -- make myProgram

After that, in my source directory, appears myProgram.o, but not the executable myProgram.

How do I run the resulting program?

cabal exec -- ./myProgram

doesn't work.

Now, I've come up with a simplest approach to test it:

cabal exec -- runghc myProgram.lhs

but I don't like this.

Do you know where the resulting executable is?

(I haven't created any cabal file for my project yet. I simply used to compile the program with bare ghc and test it, then--when I needed custom dependencies--I set up the cabal sanbox and installed the dependencies manually there.)

回答1:

This didn't actually look like a problem of cabal exec, and it wasn't!

My history

Simultaneously with starting to use the cabal sandbox, I explicitly gave a custom name to my module in the source file (myProgram.lhs). And in such case just a bare ghc (without cabal exec) wouldn't generate the executable, too, as answered in Cabal output is redirected but not generated. (I simply couldn't test the bare ghc command, because I had the dependencies in the sandbox, so my module wouldn't compile.)

Explanation

Explanation quoted from that Q&A:

I get the warning

output was redirected with -o, but no output will be generated because there is no main module.

A quote from The Haskell 98 Report:

A Haskell program is a collection of modules, one of which, by convention, must be called Main and must export the value main.

The solution

A solution is to add -main-is MyProgram.main to ghc opts. Then it generates the executable.

./myProgram simply appears in my source directory now, no matter whether I call

ghc -main-is MyProgram.main myProgram

or

cabal exec -- ghc -main-is MyProgram.main myProgram