CUDA 编程和 xCode

Posted

技术标签:

【中文标题】CUDA 编程和 xCode【英文标题】:CUDA Programming and xCode 【发布时间】:2012-07-24 14:21:35 【问题描述】:

我对 Mac OS X 完全陌生,我购买新 MacBook Pro R15 Retina 版的主要原因是开始学习 CUDA API。

但我无法构建我的项目。

例如,当我创建一个新的 CUDA 项目时,我进入项目属性并进行以下更改:

C/C++/Objective-C 编译器:LLVM GCC 4.2

其他链接器标志:-lcuda, -lcudart

标题搜索路径:/usr/local/cuda/include

库搜索路径:/usr/local/cuda/lib

当我开始在我的代码中添加必要的库时,一切都运行良好。我的代码没有输入错误。

当我构建项目时,我得到了链接错误(路径被缩短并且消息被分解以提高可读性):

ld /my_test_project/Build/Products/Debug/test normal x86_64 cd /Users/Admin/Documents/test setenv MACOSX_DEPLOYMENT_TARGET 10.7 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++

-arch x86_64

-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk

-L/my_test_project/Build/Products/Debug

-L/usr/local/cuda/lib -F/my_test_project/Build/Products/Debug

-filelist /my_test_project/Build/Intermediates/test.build/Debug/test.build/Objects-normal/x86_64/test.LinkFileList

-mmacosx-version-min=10.7

-lcudart

-lcuda

-o /my_test_project/Build/Products/Debug/test

ld:找不到文件:@rpath/CUDA.framework/Versions/A/CUDA for architecture x86_64 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

奇怪的是,当我转到描述的路径时,我看到了 CUDA 可执行文件。文件在那里!

当我使用使用该库的 cuComplex.h 时,每一个数学表达式(例如 log、cos、sin 等)都是“未定义变量”。但是,cuComplex.h 库中包含库。

驱动程序、SDK 和工具包都安装得很好,一切都像一个魅力。我可以让 SDK 示例正常工作。但我想我错过了一个让整个事情顺利进行的细节。

【问题讨论】:

您好 Pierre-Luc,欢迎来到 Stack Overflow。创建 CUDA 项目时,是否为与安装 CUDA 的架构相同的架构(32 位/64 位)创建它? 嗨!谢谢您的回答 !是的,一点没错。我已经在 x64 中安装了 CUDA。即使我将属性“架构”设置为 32 位并将“有效架构”设置为 i386,也会出现相同的内容,但会显示“ld: file not found: @rpath/CUDA.framework/Versions/A/CUDA for architecture i386” 我什至试过在终端编译。我得到完全相同的错误。 只是为了好玩,您是否尝试过构建发布版本? 可能是权限问题?也许尝试以 root 身份编译。 【参考方案1】:

我在安装在 Mountain Lion 上的 CUDA 5.0 和 Xcode 4.4.1 遇到了同样的问题。原因是 libcuda.dylib 将 CUDA.framework 与 rpath 链接在一起,您可以使用 otool 进行检查。

otool -L /usr/local/cuda/lib/libcuda.dylib
/usr/local/cuda/lib/libcuda.dylib:
/usr/local/cuda/lib/libcuda.dylib (compatibility version 1.1.0, current version 5.0.17)
@rpath/CUDA.framework/Versions/A/CUDA (compatibility version 1.1.0, current version 5.0.17)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)

但是,Xcode 似乎无法识别 /Library/Frameworks 下的 CUDA.framework。原因不明。您必须自己将其添加到您的项目中。

在您的项目属性页面中,单击 Build Phases -> Link with Libraries。选择 CUDA.framework。如果它没有出现在列表中,请使用“添加其他”添加它。这样你就可以把它链接起来。

如果您正在编写 Makefile,您希望添加它以完全自动化链接阶段:

-F/Library/Frameworks -framework CUDA

【讨论】:

嗨,我也遇到了 Pierre-Luc Delisle 的错误,并试图通过添加 CUDA.framework 来克服这个问题。现在虽然我收到这样的错误: ld: framework not found CUDA clang: error: linker command failed with exit code 1 (use -v to see invocation) 请提前帮助和感谢... PS:我正在运行 Mac 2010 年中 Mac mini 上的 OS 10.8.2 和 XCode 4.5。【参考方案2】:

作为对我的设置更有效的替代方法是更改​​ libcuda 的路径,如下所示:

sudo install_name_tool -change @rpath/CUDA.framework/Versions/A/CUDA \
    /Library/Frameworks/CUDA.framework/CUDA \
    /usr/local/cuda/lib/libcuda.dylib

像往常一样,如果您不明白它的作用,请不要将 sudo 命令粘贴到您的终端中。

【讨论】:

阅读 install_name_tool 的手册 - 更改您需要恢复路径 知道了。谢谢。只需将新旧路径参数交换为 -change 选项。【参考方案3】:

我在使用 Xcode 6.1 的 OS X 10.10 上编译 CUDA 6.5 示例时遇到了同样的问题。问题发生在 Makefiles 包含以下行的示例中:

ALL_LDFLAGS += -Xlinker -framework -Xlinker CUDA

解决方法是告诉链接器有关 /Library/Frameworks 的信息,以便将上面的内容替换为 2 行:

ALL_LDFLAGS += -Xlinker -F/Library/Frameworks
ALL_LDFLAGS += -Xlinker -framework -Xlinker CUDA

大概您的问题在这一点上得到了回答,但是这个页面几乎是“ld: framework not found CUDA”的唯一谷歌结果,希望这可以节省其他人一些时间。

【讨论】:

【参考方案4】:

在编译示例文件时,我遇到了与 CUDA 8.0 和 OSX 10.12 类似的 CUDA 链接问题。将以下内容添加到 make 文件中解决了问题。

LDFLAGS += -Xlinker -F/Library/Frameworks

【讨论】:

以上是关于CUDA 编程和 xCode的主要内容,如果未能解决你的问题,请参考以下文章

关于CUDA编程模型的问题

CUDA 编程:第一个CUDA程序

CUDA编程入门极简教程(转)

CA 周记 - 派福利!通过 Azure 零成本进入 CUDA 编程

cuda并行程序设计 gpu编程指南

GPU高性能运算之CUDA,CUDA编程报错,大牛帮忙解答啊