Haskell FFI c2hs链接错误 目的和设置

Haskell FFI c2hs链接错误 目的和设置,c,haskell,linker,ffi,C,Haskell,Linker,Ffi,目标:我正在尝试使用绑定到 为此,我选择使用该工具来帮助编写绑定。我试图包装的文件被调用。该文件的核心是以下功能: #define POSITIVE_SIGN 1 #define NEGATIVE_SIGN -1 struct _ffts_plan_t; typedef struct _ffts_plan_t ffts_plan_t; ffts_plan_t *ffts_init_1d(size_t N, int sign); ffts_plan_t *ffts_init_2d(size_t

目标:我正在尝试使用绑定到

为此,我选择使用该工具来帮助编写绑定。我试图包装的文件被调用。该文件的核心是以下功能:

#define POSITIVE_SIGN 1
#define NEGATIVE_SIGN -1

struct _ffts_plan_t;
typedef struct _ffts_plan_t ffts_plan_t;

ffts_plan_t *ffts_init_1d(size_t N, int sign);
ffts_plan_t *ffts_init_2d(size_t N1, size_t N2, int sign);
ffts_plan_t *ffts_init_nd(int rank, size_t *Ns, int sign);

// For real transforms, sign == -1 implies a real-to-complex forwards tranform,
// and sign == 1 implies a complex-to-real backwards transform
// The output of a real-to-complex transform is N/2+1 complex numbers, where the
// redundant outputs have been omitted.
ffts_plan_t *ffts_init_1d_real(size_t N, int sign);
ffts_plan_t *ffts_init_2d_real(size_t N1, size_t N2, int sign);
ffts_plan_t *ffts_init_nd_real(int rank, size_t *Ns, int sign);

void ffts_execute(ffts_plan_t * , const void *input, void *output);
void ffts_free(ffts_plan_t *);
如您所见,只有8个函数,一个结构总是由指向它的指针引用,两个定义。很简单

我写了一个包装这些功能,你可以。然后,我将确保正确编译该文件

问题 此时,我试图开始为FFTS库编写HUnit测试用例,以确保它按预期工作。 但是,当我编译代码时,在链接测试ffts TestSuite的最后阶段,我遇到了以下错误:

Linking dist/dist-sandbox-c6bcbb0c/build/test-fftsStub/test-fftsStub ...
/home/robert/Projects/haffts/dist/dist-sandbox-c6bcbb0c/build/libtest-ffts.a(HUnitTests.o): In function `s3l6_info':
(.text+0x418): undefined reference to `testzmfftszm0zi1zi0zi0_FFTS_fftsFree_closure'
/home/robert/Projects/haffts/dist/dist-sandbox-c6bcbb0c/build/libtest-ffts.a(HUnitTests.o): In function `s3l3_info':
(.text+0x363): undefined reference to `testzmfftszm0zi1zi0zi0_FFTS_fftsExecute_info'
/home/robert/Projects/haffts/dist/dist-sandbox-c6bcbb0c/build/libtest-ffts.a(HUnitTests.o): In function `testzmfftszm0zi1zi0zi0_HUnitTests_hunitTests3_srt':
(.data+0xd0): undefined reference to `testzmfftszm0zi1zi0zi0_FFTS_fftsFree_closure'
/home/robert/Projects/haffts/dist/dist-sandbox-c6bcbb0c/build/libtest-ffts.a(HUnitTests.o): In function `testzmfftszm0zi1zi0zi0_HUnitTests_hunitTests3_srt':
(.data+0xd8): undefined reference to `testzmfftszm0zi1zi0zi0_FFTS_fftsExecute_closure'
collect2: ld returned 1 exit status
Failed to install haffts-0.1.0.0
所以这很奇怪。如果这是可信的,那么链接器失败了,因为它找不到fftsFree或fftsExecute闭包。所以我决定看看里面:

$ ar t dist/dist-sandbox-c6bcbb0c/build/libtest-ffts.a
FFTSTest.o
HUnitTests.o
$ nm dist/dist-sandbox-c6bcbb0c/build/libtest-ffts.a | grep fftsFree
                 U testzmfftszm0zi1zi0zi0_FFTS_fftsFree_closure
$ nm dist/dist-sandbox-c6bcbb0c/build/libtest-ffts.a | grep fftsExecute
                 U testzmfftszm0zi1zi0zi0_FFTS_fftsExecute_closure
                 U testzmfftszm0zi1zi0zi0_FFTS_fftsExecute_info
$
现在,这似乎表明只有FFTSTest和HUnitTests对象库进入了归档,而fftsFree和fftsExecute函数不存在。 但这很奇怪,因为它们应该在我的“构建依赖”包含“haffts”依赖时提供

此时此刻,我不确定我做错了什么导致了这个错误。我真的需要一些帮助来解决这个问题和任何正确的建议 如蒙指导,将不胜感激

我的问题是:如何修复此错误消息并使其正确链接?

自己复制问题 此外,如果您希望自己重现问题:

git clone https://bitbucket.org/robertmassaioli/haffts.git
cd haffts
git co -b problem-branch 02c5157d149b5ddda56abc83513998bac6966dc3
cabal sandbox init
cabal install --enable-tests

你应该遇到完全相同的问题。

这很奇怪。在测试用例的其他模块部分添加原始库似乎成功了。似乎它想为测试用例再次编译它。我觉得这很奇怪。为什么它不能重用它已经构建的一个呢?如果有人明白为什么,那你能回答这个问题吗?干杯