如何使用CMake创建静态库并将其与Haskell Stack项目链接

时间:2018-04-09 18:59:58

标签: c++ c haskell cmake haskell-stack

我想在我的Haskell项目中使用第三方C ++库。但是,运行stack build时出现以下错误:

/home/ryselis/IdeaProjects/realsense-haskell/.stack-work/dist/x86_64-linux/Cabal-2.0.1.0/build/libHSrealsense-haskell-0.1.0.0-AnzRMqdjClnDgHnOUGe4TP.a(Realsense.o):ghc_16.c:function inline_c_Realsense_6: error: undefined reference to 'autoConfigurePersonTracking'
collect2: error: ld returned 1 exit status
`gcc' failed in phase `Linker'. (Exit code: 1)
--  While building custom Setup.hs for package realsense-haskell-0.1.0.0 using:
  /home/ryselis/.stack/setup-exe-cache/x86_64-linux/Cabal-simple_mPHDZzAJ_2.0.1.0_ghc-8.2.2 --builddir=.stack-work/dist/x86_64-linux/Cabal-2.0.1.0 build lib:realsense-haskell exe:realsense-haskell-exe --ghc-options " -ddump-hi -ddump-to-file"
Process exited with code: ExitFailure 1

我使用的第三方库是librealsense。由于Haskell与C ++的集成很难,我决定为这个库制作C包装器。作为一个最小的例子,我试过这个:我创建了一个CMake项目。不包括编译器指令的头文件如下所示:

extern "C" {
    void autoConfigurePersonTracking();
};

.cpp文件包含librealsense的包含,并定义函数autoConfigurePersonTracking

在我的Haskell项目中,我的堆栈package.yaml包含此部分:

executables:
  realsense-haskell-exe:
    main:                Main.hs
    source-dirs:         app
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - realsense-haskell
    extra-include-dirs:
    - /home/ryselis/CLionProjects/realsense_c_wrapper/
    extra-lib-dirs:
    - /usr/local/lib/
    - /home/ryselis/CLionProjects/realsense_c_wrapper/
    extra-libraries:
    - realsense
    - realsense_c_wrapper

realsense_c_wrapper是我的静态C包装器的名称。在我的Haskell代码中,我使用inline-c-cpp库并定义了这个函数:

autoConfigurePersonTracking :: IO ()
autoConfigurePersonTracking = [C.block| void {
  autoConfigurePersonTracking();
}|]

但是,链接失败,上面给出了例外情况。

我的静态库标题位于/home/ryselis/CLionProjects/realsense_c_wrapper/,库本身位于/usr/local/lib/librealsense_c_wrapper.alibrealsense位于同一目录中并且链接正常。

我错过了什么?

0 个答案:

没有答案