我想在我的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.a
。 librealsense
位于同一目录中并且链接正常。
我错过了什么?