OSX上的CUDA - NVCC找不到STL数组头

时间:2014-06-19 22:14:48

标签: cuda osx-mavericks nvcc

我正在将CUDA应用程序从Windows移植到OSX,并且无法进行任何编译。 (最终我试图让Xcode使用自定义构建规则构建我的.cu源代码,但这是另一个故事[除非有人拥有可与Xcode 5一起使用的更新CUDA插件]。)

以下是终端中发生的事情:

$ nvcc -ccbin /usr/bin/clang -gencode=arch=compute_30,code=\"sm_30,compute_30\" --compile -cudart static -o Visualizer.cu.obj Visualizer.cu
Visualizer.cu:4:10: fatal error: 'array' file not found
#include <array>
         ^
1 error generated.
$

这里是相关源文件的顶部:

#include "Visualizer.cuh"

#include <iostream>
#include <array>

using namespace std;

#include "CudaHelpers.h"
#include "OpenGLHelpers.h"
#include "GLError.h"
#include "Files.h"


Visualizer::Visualizer(void)
{
    /// constructor code removed for brevity
}


Visualizer::~Visualizer(void)
{
}

/// snip

nvcc似乎无法找到STL array标头。 (值得注意的是array似乎是C ++ 11标题,但我不确定这是否相关。)

我觉得奇怪的是它无法找到array,但iostream不是问题。

有什么建议吗?使用相同的CUDA SDK版本(5.5)在Win7 x64下构建相同的源文件。

如果它有用的话,我在{i}用于启动env的同一终端会话中输出nvcc

$ env
TERM_PROGRAM=iTerm.app
TERM=xterm
SHELL=/bin/bash
TMPDIR=/var/folders/sw/7xhtxxnd39x8r5zy9tkq94780000gn/T/
Apple_PubSub_Socket_Render=/tmp/launch-JgrEAi/Render
USER=dlively
SSH_AUTH_SOCK=/tmp/launch-HkiDEO/Listeners
__CF_USER_TEXT_ENCODING=0x1F5:0:0
__CHECKFIX1436934=1
PATH=/usr/local/cuda/bin:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
PWD=/Users/dlively/projects/thesis/GoLightly/GoLightly
DBUS_LAUNCHD_SESSION_BUS_SOCKET=/tmp/launch-335uC6/unix_domain_listener
LANG=en_US.UTF-8
ITERM_PROFILE=Default
SHLVL=1
COLORFGBG=7;0
HOME=/Users/dlively
DYLD_LIBRARY_PATH=/usr/local/cuda/lib:
ITERM_SESSION_ID=w0t0p0
LOGNAME=my_user_name
_=/usr/bin/env
OLDPWD=/Users/dlively/projects/thesis/GoLightly
$

我想到STL标题/ libs根本没有被任何环境变量引用,但是我不确定那些位于哪里,或者最好的方式(环境变量?{ {1}}?nvcc.profile命令行选项?)提供该信息。

帮助!

更新

所有CUDA样本都正确构建(通过-I...)。但是,如果我添加一行

make

到任何源文件(即使在样本中),它也会失败。

更新2

#include <array> 的输出:

nvcc --verbose

2 个答案:

答案 0 :(得分:2)

这是C ++ 11标头,在Mac上可用的libstdc ++版本中不可用。请注意,不建议将CUDA运行时库与libc ++链接,因此您应该在CUDA代码中避免使用这些功能。

有关令人困惑的条款的一些细节:

  • libstdc ++ - GNU C ++标准库。出于兼容性目的,Apple提供相当旧的版本。
  • libc ++ - 它是在LLVM下开发的C ++标准库。自AFAIK,10.9和XCode 5以来,Apple一直积极参与其开发并与之建立联系。

<强>更新

注意输出标志“-stdlib = libstdc ++”传递给clang。这就是选择标准库的原因。

答案 1 :(得分:-2)

-Xcompiler="--stdlib=libstdc++"