首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell FFI局部c头

Haskell FFI局部c头
EN

Stack Overflow用户
提问于 2018-11-04 23:21:58
回答 1查看 380关注 0票数 3

我想用FFI调用一个C单头库。

这是Nuk.hs

代码语言:javascript
复制
{-# LANGUAGE CPP, ForeignFunctionInterface #-}
module Main where

import Foreign
import Foreign.C.Types

foreign import ccall unsafe "nuklear.h nk_sin"
 c_nk_sin:: IO CFloat

main = print $ c_nk_sin (5)

在同一个目录中,我有一个nuklear.h

当我做stack ghc Nuk.hs时,我得到

代码语言:javascript
复制
[1 of 1] Compiling Main             ( Nuk.hs, Nuk.o )
Linking Nuk ...
Nuk.o:r1Rq_info: error: undefined reference to 'nk_sin'
collect2: error: ld returned 1 exit status
`gcc' failed in phase `Linker'. (Exit code: 1)

我该怎么解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-05 00:04:05

如果它只是一个标头库,您需要一个C编译器来为它生成一个对象文件,这样您的Haskell程序就可以链接到定义。根据Nuklear的文档,您可以创建一个存根C文件:

代码语言:javascript
复制
// nuklear.c
#define NK_IMPLEMENTATION
#include "nuklear.h"

作为构建的一部分,编译它(例如使用gcc -c nuklear.c -o nuklear.o)以生成对象文件nuklear.o,使用ar (例如ar -csr libnuklear.a nuklear.o)创建静态库libnuklear.a,然后假设此存档位于libs中,则添加:

代码语言:javascript
复制
extra-lib-dirs: libs
extra-libraries: nuklear

到您的Cabal文件中的executable部分。(或者package.yml中对应的hpack部分。)

为了协调这一点,您可能有一个生成这个库的Makefile,并且调用stack/cabal/ghc来生成最终的构建结果。本教程以更明确的细节介绍了这个过程。但是对于这个简单的用例,您可能只需要在Cabal内部使用部分来完成这个任务:

代码语言:javascript
复制
c-sources: nuklear.c

您还可能需要指定includesinclude-dirs,例如:

代码语言:javascript
复制
includes: nuklear.h
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53146472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档