我有一个Haskell项目,旨在创建一些C++绑定。我已经编写了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文件中,因为这就是我在实际项目中的做法。该项目使用“make”通过Cabal构建C库,然后进行构建步骤。我已经验证在构建步骤中,BuildInfo
的extraLibs
部分包含库名称,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库。没有其他警告或错误。