나는 C++ 바인딩을 생성하는 것을 목표로하는 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)와 하스켈 (https://github.com/deech/CPlusPlusBindings/blob/master/src/BindingTest.chs를) 파일.
C 라이브러리는 Cabal 파일에없는 Setup.hs에 추가됩니다. 그게 바로 빌드 스텝 f 전에 Cabal을 통해 "make"를 사용하여 C 라이브러리를 빌드하는 실제 프로젝트를 가지고 있기 때문입니다. 빌드 단계에서 의 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 라이브러리를 사용합니다. 다른 경고 또는 오류는 없습니다.