我目前正在尝试在 MacOS 10.9 上使用 Cmake 构建 Cuda 项目。我的 C 和 C++ 编译器是 gcc,但似乎因为 Mavericks gcc 和 g++ 链接到 clang,CUDA 不支持。
有没有人找到一个很好的解决方案来使用真正的 gcc,或者在没有“dumpspecs”的情况下让 clang 工作?
我目前正在尝试在 MacOS 10.9 上使用 Cmake 构建 Cuda 项目。我的 C 和 C++ 编译器是 gcc,但似乎因为 Mavericks gcc 和 g++ 链接到 clang,CUDA 不支持。
有没有人找到一个很好的解决方案来使用真正的 gcc,或者在没有“dumpspecs”的情况下让 clang 工作?
10.9 的问题gcc
实际上是铿锵声。请尝试最新的 CUDA 工具包并明确指出 NVCC 使用 /usr/bin/clang (nvcc -ccbin /usr/bin/clang)。这样NVCC就会知道它正在处理clang。
这是 Eugene 提供的答案的扩展:
Mac OSX 10.9 的 CUDA 工具包下载已发布到CUDA 下载页面
它在 10.9 上支持 XCode 5,并且会自动使用 clang 而不是 gcc,仅供参考。
如果您在 10.8 上使用 XCode 5,请参阅发行说明:
· 在 Mac OS X 10.8 上,如果您安装 XCode 5,包括命令行工具,gcc 编译器将被 clang 取代。您可以使用 --ccbin /usr/bin/clang 选项从命令行继续成功编译 nvcc,该选项指示 nvcc 使用 clang 编译器而不是 gcc 来编译传递给它的任何主机代码。但是,当使用 NSight Eclipse Edition 构建时,此解决方案将不起作用。可以从命令行和 NSight Eclipse 版一起使用的替代解决方案是在安装 XCode 5 后从 Apple Developer 网站下载旧版本的命令行工具包,这会将 gcc 重新安装到 /usr/bin . 为此,请访问
http://developer.apple.com/downloads/index.action
使用您的 Apple ID 登录,然后使用屏幕左侧的搜索窗格搜索命令行工具。
这个问题实际上在 OS X Mavericks 之前就已经存在,我对 Moutain Lion 也有同样的问题,而 Eugene 的回答是 100% 正确的。
但是,自从升级到 Mavericks 后,我的 Geforce 卡似乎没有被识别为支持 CUDA 的设备,而且使用使用 CUDA 的软件的人似乎也遇到了同样的问题。
所以最好不要马上更新
我刚刚下载了 CUDA 5.5,安装在 Mac OSX 10.8.5 下,带有 Xcode 5.0.2,并在 Xcode 中更新了命令行工具。但我无法编译 CUDA 示例“nbody”。我收到了各种有趣的错误信息,比如
clang 错误:不支持的选项 '-dumpspecs'我以为我已经通过其他一些网页的帮助解决了这个问题,但随后其他问题不断出现(例如,GLEW 未找到,CUDA 示例路径未定义,...)。(而且提供的 makefile 和 cmake 文件似乎太做作了,所以我找不到错误。)
所以我推出了自己的makefile。我把它贴在这里,希望它可以帮助其他人节省一些时间。
#!/usr/bin/make -R # 用于 CUDA 示例程序的简单 Makefile # (因为提供的那些不起作用!:-( ) # # 我们假设这个目录中的所有文件都产生一个可执行文件。 # 在下面的变量 NVCC 中设置你的 GPU 版本 # # 在Mac OS X 10.8.5下开发测试; # 在Linux 下,你可能需要调整一些路径、编译器选项和#ifdef。 # # 先决条件: # - CUDA 5.5 # - 通过 XCode 5 安装的“命令行工具” # - DYLD_FALLBACK_LIBRARY_PATH 或 DYLD_LIBRARY_PATH 必须包括 # /Developer/NVIDIA/CUDA-5.5/lib:/Developer/NVIDIA/CUDA-5.5/samples/common/lib/darwin # # 广州 2013 年 12 月 # -------- 变量和设置 --------- # CUDA := /Developer/NVIDIA/CUDA-5.5 NVCC := nvcc -ccbin /usr/bin/clang -arch=sm_30 --compiler-options -Wall,-ansi,-Wno-extra-tokens # OSX 10.8 下的 XCode 5 需要 -ccbin /usr/bin/clang # 我的笔记本电脑需要 -arch=sm_30(它不提供 sm_35) INCFLAGS := -I $(CUDA)/samples/common/inc 目标:= nbody OBJDIR := 对象 制造标志:= kR .后缀:.cu .cpp .h ALLSOURCES := $(通配符 *.cu *.cpp) ALLFILES := $(basename $(ALLSOURCES)) ALLOBJS := $(addsuffix .o,$(addprefix $(OBJDIR)/,$(ALLFILES))) DEPDIR := 依赖 # --------- 自动目标 -------------- .PHONY:全部 全部:$(OBJDIR)$(DEPDIR)$(目标) @真的 $(OBJDIR): mkdir $@ # --------- 通用规则 -------------- UNAME = $(shell unname) ifeq ($(UNAME), 达尔文) # Mac OS X # OpenGL 和 GLUT 是框架 LDFLAGS = -Xlinker -framework,OpenGL,-framework,GLUT,-L,$(CUDA)/samples/common/lib/darwin,-lGLEW 万一 $(目标): $(ALLOBJS) $(NVCC) $^ $(LDFLAGS) -o $@ $(OBJDIR)/%.o: %.cu $(NVCC) -c $(INCFLAGS) $$@ $(DEPDIR)/%.d : %.cpp $(DEPDIR) @echo 为 $ $@ 创建依赖项 $(DEPDIR): mkdir $@ # ------ 管理的东西 -------- .PHONY:干净 干净的: rm -f *.o $(目标) rm -rf $(DEPDIR) $(OBJDIR) 回声: @echo $(ALLSOURCES) @echo $(所有文件) @echo $(ALLOBJS)
Clang 成为 OsX Maverick 版本的默认编译器,gcc 和 g++ 命令被重定向到 clang 编译器。您可以通过自制软件下载 gcc 编译器,并按照以下步骤将 gcc 和 g++ 命令链接回 gcc 编译器。
$ brew install gcc48
[...]
$ sudo mkdir /usr/bin/backup && sudo mv /usr/bin/gcc /usr/bin/g++ /usr/bin/backup
$ sudo ln -s /usr/local/bin/gcc-4.8 /usr/bin/gcc
$ sudo ln -s /usr/local/bin/g++-4.8 /usr/bin/g++
我在这篇文章中找到了解决方案:http: //gvsmirnov.ru/blog/tech/2014/02/07/building-openjdk-8-on-osx-maverick.html#all-you-had-to-do -是跟随-该死的火车-cj
这是一个 Homebrew 食谱,适用于我的 Lion。
$ brew cat memtestG80
require "formula"
# Documentation: https://github.com/Homebrew/homebrew/wiki/Formula-Cookbook
# /usr/local/Library/Contributions/example-formula.rb
# PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!
# Requires at compile time nvcc from https://developer.nvidia.com/cuda-downloads
# Requires popt at compile time
class Memtestg80 < Formula
homepage ""
url "https://github.com/ihaque/memtestG80/archive/master.zip"
sha1 ""
version "c4336a69fff07945c322d6c7fc40b0b12341cc4c"
# depends_on "cmake" => :build
depends_on :x11 # if your formula requires any X11/XQuartz components
def install
# ENV.deparallelize # if your formula fails when building in parallel
system "make", "-f", "Makefiles/Makefile.osx", "NVCC=/usr/local/cuda/bin/nvcc -ccbin /usr/bin/clang", "POPT_DIR=/usr/local/Cellar/popt/1.16/lib"
system "cp", "-a", "memtestG80", "/usr/local/bin"
end
test do
# `test do` will create, run in and delete a temporary directory.
#
# This test will fail and we won't accept that! It's enough to just replace
# "false" with the main program this formula installs, but it'd be nice if you
# were more thorough. Run the test with `brew test memtestG80`.
#
# The installed folder is not in the path, so use the entire path to any
# executables being tested: `system "#{bin}/program", "do", "something"`.
system "false"
end
end