Skip to content

Symbols from c-sources not present in DLL on Windows #2589

Open
@pawelp7

Description

@pawelp7

Hi,
I want to create a dynamic library from my Haskell program. However, I'm not able to get it to build correctly using cabal on Windows (x64).

As a starting point I used the sample provided by the official GHC documentation: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/win32-dlls.html

In short, I have cabal project containing of a single Punktor.hs file and a single StartEnd.c file. I expect that functions from StartEnd.c file will be accessible in the generated .dll library and its imports library (.a) as well.

When I compile all files manually by invoking ghc this solution just works! I've executed following commands:

  • ghc -c Punktor.hs
  • ghc -c StartEnd.c
  • ghc -shared Punktor.o StartEnd.o

which gave me .dll file (along with the .a) with symbols from my StartEnd.c file as expected.

I'm not able to get the same results using the cabal project and invoking cabal install. I have added -shared to the GHC-Options section.

After cabal install a few files are created, in particular HSdll.dll/HSdll.dll.a (in hs/ folder). The generated files do not inlude symbols from the StartEnd.c that was included in the c-sources section of the .cabal file.
I am able to use that files to link the library with my C++ program and call Haskell functions (that were exposed with foreign export) but not the helper functions from StartEnd.c.

I have tried the same thing on Linux. The cabal install outputs just a single .so file (with no separate import library) that misses the symbols from .c file (same problem as on Windows). However, in the dist/build directory there is present pair of files libHSpunktor-0.1.0.0.a and libHSpunktor-0.1.0.0-ghc7.8.4.so. These files are correct (contain needed symbols) and I'm able to call them from my separate C++ project (what is the point). Interestingly, on Windows in said location there is just a single libHSpunktor-0.1.0.0.a file that is not usable with MS linker (is this just a static library version of the package?).
The difference might be caused by adding the -dynamic option on Linux, not sure about that -- just mentioning it in case it is relevant.

So the question is: why does StartEnd.c file is not linked into the generated library?
Is there any way to make it linked using cabal -- to achieve same result as by manually calling ghc as described above?

simplified project tree:

|-- cpp
|   |-- main.cpp
`-- hs
    |-- punktor.cabal
    |-- Setup.hs
    `-- src
        |-- Punktor.hs
        `-- StartEnd.c

Link to sources: https://github.com/pawelp7/hsdll

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions