使用带有 inline-c-cpp 的 C++ 库 (boost)

Posted

技术标签:

【中文标题】使用带有 inline-c-cpp 的 C++ 库 (boost)【英文标题】:Using a C++ library (boost) with inline-c-cpp 【发布时间】:2017-06-25 14:46:24 【问题描述】:

在 Haskell 中,我想在 inline-c-cpp 的帮助下从 boost C++ library 调用一个函数。

下载boost库后,如何配置cabal文件和stack.yaml中的extra-lib-dirsextra-include-dirs字段?

cabal 文件中,我写:extra-libraries: boost,我尝试了extra-lib-dirsextra-include-dirs 中的几个文件夹,但我总是得到Missing C library: boost

编辑

这是我在@n.m. 的 cmets 之后的尝试。在stack.yaml:

extra-include-dirs:
- U:\Data\C\boost_1_64_0

在 cabal 文件中:

  extra-libraries:     stdc++
  c-sources:           src/Main.cpp

我的模块:

-# LANGUAGE TemplateHaskell #-
-# LANGUAGE QuasiQuotes #-
-# LANGUAGE ForeignFunctionInterface #-

module Main
  where
import qualified Language.C.Inline.Cpp as C

C.context C.cppCtx

C.include "<iostream>"
C.include "<boost/math/special_functions/owens_t.hpp>"

main :: C.CDouble -> C.CDouble -> IO ()
main h a = do
  [C.block| void 
      std::cout << "Hello, Owen! " << boost::math::owens_t($(double h), $(double a)) << std::endl;
     |]

代码编译没有问题。但是,当我在GHCi 中运行main 1 1 时,我得到了错误

ghc.exe: C:\HaskellProjects\inlinecpp\.stack-work\install\e77882c1\lib\x86_64-windows-ghc-8.0.2\inlinecpp-0.1.0.0-IWaed3tDnUhE52nToDO1Sq\HSinlinecpp-0.1.0.0-IWaed3tDnUhE52nToDO1Sq.o: unknown symbol `_Unwind_Resume'

编辑

如果我这样做并运行可执行文件,这将有效。但我想在 GHCi 中使用它。

【问题讨论】:

Boost 是一个库集合。它通常分为几十个库文件。您的系统不太可能有一个名为 boost 的库。告诉你要调用哪些函数会有所帮助。 @n.m.好的谢谢。我想在boost/math/special_functions 中打电话给owens_t owens_t 是一个纯模板函数,不在任何可链接库中。 这意味着不可能?很遗憾,我可以通过R 拨打电话。 不,这意味着您没有任何要链接的库。您只需指定extra-include-dirs 【参考方案1】:

编辑中发布的代码在 GHCi 中使用 ghc 8.2.1

Prelude Main> main 0.5 0.5
Hello, Owen! 0.0644886

【讨论】:

以上是关于使用带有 inline-c-cpp 的 C++ 库 (boost)的主要内容,如果未能解决你的问题,请参考以下文章

C++ 使用带有在头文件中定义的全局变量的 C 库

带有静态库的 Android Studio 中的本机 C++ 代码

如何在带有 VB.net GUI 的 C++ OpenCV 项目中使用 C# 库?

尝试使用 c++ .so 库编译 c 代码,带有 extern "C" ... 段

在 C++ 上使用带有 LoadLibrary() 方法的库 dll

如何使用带有 eigen 数学库的 gdb 进行调试