使用带有 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-dirs
和extra-include-dirs
字段?
在cabal
文件中,我写:extra-libraries: boost
,我尝试了extra-lib-dirs
和extra-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)的主要内容,如果未能解决你的问题,请参考以下文章
带有静态库的 Android Studio 中的本机 C++ 代码
如何在带有 VB.net GUI 的 C++ OpenCV 项目中使用 C# 库?
尝试使用 c++ .so 库编译 c 代码,带有 extern "C" ... 段