在Win7上使用Autoconf为Haskell安装CUDA

时间:2012-01-17 05:17:47

标签: haskell cuda autoconf

我正在尝试使用Cygwin在Windows上安装以下Haskell软件包:HaskellCuda

您可以使用“cabal install cuda”安装软件包。

这是我得到的输出(你可能必须先“cuda install c2hs”):

$ cabal install
Configuring cuda-0.4.0.2...
checking for gcc... C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe
checking for C compiler default output file name...
configure: error: C compiler cannot create executables
See `config.log' for more details.
Resolving dependencies...
cabal.exe: Error: some packages failed to install:
cuda-0.4.0.2 failed during the configure step. The exception was:
ExitFailure 77

日志文件中的相关部分是:

configure:1758: checking for gcc
configure:1785: result: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe
configure:2022: checking for C compiler version
configure:2029: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe --version >&5
configure: line 2030: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe: command not found
configure:2035: $? = 127
configure:2042: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe -v >&5
configure: line 2043: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe: command not found
configure:2045: $? = 127
configure:2052: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe -V >&5
configure: line 2053: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe: command not found
configure:2055: $? = 127
configure:2078: checking for C compiler default output file name
configure:2105: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe -fno-stack-protector   conftest.c  >&5
configure: line 2106: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe: command not found
configure:2108: $? = 127
configure:2146: result: 
configure: failed program was: [source elided]

如果我去Cygwin并输入

gcc --version

我得到了合理的东西。问题似乎更多的是我猜的路径,但我不确定是什么/如何解决它。我还应该注意使用“cabal install cuda-0.2.2”这个软件包的旧版本,我已经过了这一步(但稍后会出现不同的错误)。

要复制,请确保在没有空格的路径中安装Haskell平台,否则您可能会收到不同的错误。到目前为止,这是我唯一想到的。

任何有关这方面的帮助都会非常感激,到目前为止我已经花了大约一个星期而且没有到达任何地方。

编辑:

$PATH = C:\Haskell\2011.4.0.0\mingw\bin;
C:\Haskell\2011.4.0.0\lib\extralibs\bin;
C:\Haskell\2011.4.0.0\bin;
C:\CUDA\v4.0\bin\;
C:\cygwin\bin\;
...

1 个答案:

答案 0 :(得分:0)

我设法让它安装,但它并不漂亮,我真的不明白为什么它不能用于“autoconf”框。

首先,我使用序列

而不是使用“cabal install”安装(使用本地副本)
>runhaskell Setup.hs configure
>runhaskell Setup.hs build
>runhaskell Setup.hs install

这样做的主要原因是因为使用Setup.hs中的参数更改configure脚本中的$ CC变量很简单。我怀疑$ CC是变量给我的问题。我改变了:

[("CC",       ccProg)

[("CC",       "/cygdrive/c/cygwin/bin/gcc.exe")
在Setup.hs中的

,它是Cygwin附带的gcc。我最初的怀疑是autoconf不喜欢Windows风格的gcc路径,它正在使用基于上面的日志文件。我也发现了我的计算机上的gcc的多个副本(一个在Haskell / mingw中,一个在单独安装的mingw中,以及$ PATH指向的任何版本,只有cygwin gcc能够成功编译测试文件检查。使用cygwin gcc,我可以运行

gcc hello.c

包含任何文件(没有外部包含指令),而对于任何其他gcc副本,甚至类似

gcc -I/cygdrive/c/..../include hello.c

无法找到。不知道为什么。

只需将$ CC更改为Cygwin gcc即可修复几乎所有错误。 “检查包含cudaRuntimeGetVersion / cuGetDriverVersion的库”时发生了下一个错误。

文件configure尝试编译

#define PACKAGE_NAME "Haskell CUDA bindings"
#define PACKAGE_TARNAME "cuda"
#define PACKAGE_VERSION "0.4.0.0"
#define PACKAGE_STRING "Haskell CUDA bindings 0.4.0.0"
#define PACKAGE_BUGREPORT "tmcdonell@cse.unsw.edu.au"
#define STDC_HEADERS 1
#define HAVE_SYS_TYPES_H 1
#define HAVE_SYS_STAT_H 1
#define HAVE_STDLIB_H 1
#define HAVE_STRING_H 1
#define HAVE_MEMORY_H 1
#define HAVE_STRINGS_H 1
#define HAVE_INTTYPES_H 1
#define HAVE_STDINT_H 1
#define HAVE_UNISTD_H 1
#define HAVE_CUDA_H 1
#define HAVE_CUDA_RUNTIME_API_H 1
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char cudaRuntimeGetVersion ();
int main ()
{
 return cudaRuntimeGetVersion ();
 ;
 return 0;
}

使用命令:

/cygdrive/c/cygwin/bin/gcc.exe -o conftest.exe -fno-stack-protector  
-I/cygdrive/c/CUDA/v4.0/include   -L/cygdrive/c/CUDA/v4.0/lib  conftest.c -lcudart

错误(来自日志文件)是

/cygdrive/c/Users/crockeea/AppData/Local/Temp/ccKMQJiq.o:conftest.c:(.text+0xc):
undefined reference to `_cudaRuntimeGetVersion'

我的C上有点生疏,但似乎这里没有包含相应的头文件。这可能是不对的,因为在运行configure时,同一个文件在基于Unix的系统上运行,但这是我最好的猜测。此外,编辑configure以使此文件包含cuda.h只会导致有关cudaRuntimeGetVersion的多个定义的不同错误。所以我的黑客是在配置文件中注释掉cudaRuntimeGetVersion / cuGetDriverVersion的引用。我将C-comments放入配置文件将要编译的C文件中(很容易根据日志文件中的行号在配置文件中找到这些文件的源代码)。我不知道以这种方式修改配置文件的后果。

这使我能够超越“构建”阶段。如果我遇到任何其他问题,请发表更多评论。