我有一个旨在创建一些 C++ 绑定的 Haskell 项目。我已经编写了 C 包装器并将它们编译成一个独立的静态链接库。
我想编写 Haskell 绑定以静态链接到 C 包装器,这样我就不必单独分发 C 包装器,但我似乎无法让它工作并希望得到一些帮助。
我将 C 库指定为额外库,但我的cabal build
步骤似乎没有将其添加到编译命令中。
我创建了一个小项目来说明这一点(http://github.com/deech/CPlusPlusBindings)。
它包含一个小的 C++ 类 ( https://github.com/deech/CPlusPlusBindings/tree/master/cpp-src )、C 包装器 ( https://github.com/deech/CPlusPlusBindings/tree/master/c- src),一个有效的 C 测试例程(https://github.com/deech/CPlusPlusBindings/tree/master/c-test)和 Haskell 文件(https://github.com/deech/CPlusPlusBindings/blob/master/ src/BindingTest.chs)。
C 库是在 Setup.hs 中添加的,而不是在 Cabal 文件中,因为这就是我的真实项目的方式,它在构建步骤之前通过 Cabal 使用“make”构建 C 库。我已经验证在构建步骤中,该extraLibs
部分BuildInfo
包含库名称并extraLibDirs
包含正确的目录。
我的输出cabal build
是:
creating dist/setup
./dist/setup/setup build --verbose=2
creating dist/build
creating dist/build/autogen
Building CPlusPlusBinding-0.1.0.0...
Preprocessing library CPlusPlusBinding-0.1.0.0...
Building library...
creating dist/build
/usr/local/bin/ghc --make -fbuilding-cabal-package -O -odir dist/build -hidir dist/build -stubdir dist/build -i -idist/build -isrc -idist/build/autogen -Idist/build/autogen -Idist/build -I/home/deech/Old/Haskell/CPlusPlusBinding/c-src -I/home/deech/Old/Haskell/CPlusPlusBinding/cpp-includes -optP-include -optPdist/build/autogen/cabal_macros.h -package-name CPlusPlusBinding-0.1.0.0 -hide-all-packages -package-db dist/package.conf.inplace -package-id base-4.6.0.1-8aa5d403c45ea59dcd2c39f123e27d57 -XHaskell98 -XForeignFunctionInterface BindingTest
Linking...
/usr/bin/ar -r dist/build/libHSCPlusPlusBinding-0.1.0.0.a dist/build/BindingTest.o
/usr/bin/ar: creating dist/build/libHSCPlusPlusBinding-0.1.0.0.a
/usr/bin/ld -x --hash-size=31 --reduce-memory-overheads -r -o dist/build/HSCPlusPlusBinding-0.1.0.0.o dist/build/BindingTest.o
In-place registering CPlusPlusBinding-0.1.0.0...
/usr/local/bin/ghc-pkg update - --global --user --package-db=dist/package.conf.inplace
不幸的是,编译和链接步骤都没有使用 C 库。没有其他警告或错误。