linux - 编译/链接 CUDA 和 CPP 源文件

标签 linux compiler-construction linker cuda g++

我正在研究一个同时使用 C++ 源代码和 CUDA 的示例程序。这是我的四个源文件中的基本内容。

matrixmul.cu(主要 CUDA 源代码):

#include <stdlib.h>
#include <cutil.h>
#include "assist.h"
#include "matrixmul.h"

int main (int argc, char ** argv)
{
    ...
    computeGold(reference, hostM, hostN, Mh, Mw, Nw);  //reference to .cpp file
    ...
}

matrixmul_gold.cpp(C++源码,函数单一,无main方法):

void computeGold(float * P, const float * M, const float * N, int Mh, int Mw, int Nw)
{

    ...
}

matrixmul.h(matrixmul_gold.cpp 文件的头文件)

#ifndef matrixmul_h
#define matrixmul_h

extern "C"
void computeGold(float * P, const float * M, const float * N, int Mh, int Mw, int Nw);
#endif

assist.h(辅助函数)

我正在尝试编译和链接这些文件,以便它们正常工作。到目前为止,我可以使用以下方法编译 matrixmul_gold.cpp:

g++ -c matrixmul_gold.cpp

我可以使用以下方法编译 CUDA 源代码而不会出错:

nvcc -I/home/sbu/NVIDIA_GPU_Computing_SDK/C/common/inc -L/home/sbu/NVIDIA_GPU_Computing_SDK/C/lib matrixmul.cu -c -lcutil_x86_64

但我最终得到了两个 .O 文件。我已经尝试了很多不同的方法来链接这两个 .O 文件,但到目前为止这是不行的。什么是正确的方法?

更新:根据要求,这里是输出:

nm matrixmul_gold.o matrixmul.o | grep computeGold

nm: 'matrixmul.o': No such file
0000000000000000 T _Z11computeGoldPfPKfS1_iii

我认为 'matrixmul.o' 缺失错误是因为我在运行建议的编译命令时实际上并没有成功编译:

nvcc -I/home/sbu/NVIDIA_GPU_Computing_SDK/C/common/inc -L/home/sbu/NVIDIA_GPU_Computing_SDK/C/lib -o matrixmul matrixmul.cu matrixmul_gold.o -lcutil_x86_64

更新 2:我在 matrixmul_gold.cpp 的开头缺少一个 extern "C"。我添加了它,建议的编译命令效果很好。谢谢!

最佳答案

通常,您将使用您正在使用的任何编译器来编译包含主子例程的代码以链接应用程序。在这种情况下,您在 .cu 中有 main,因此使用 nvcc 进行链接。像这样:

$ g++ -c matrixmul_gold.cpp
$ nvcc -I/home/sbu/NVIDIA_GPU_Computing_SDK/C/common/inc \
-L/home/sbu/NVIDIA_GPU_Computing_SDK/C/lib \
-o matrixmul matrixmul.cu matrixmul_gold.o -lcutil_x86_64

这将从 matrixmul.cumatrixmul_gold.o 和 cutil 库链接一个名为 matrimul 的可执行二进制文件(隐式 nvcc 将链接CUDA 运行时库和 CUDA 驱动程序库)。

关于linux - 编译/链接 CUDA 和 CPP 源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12288567/

相关文章:

c - 如何通过 RTEMS 链接应用程序以进行动态加载?

linux - 记录终端上的操作

c++ - 为什么我可以在 C 而不是 C++ 中设置一个匿名枚举等于另一个?

C++ "File format not recognized"?

gcc - 无法将 portaudio 库链接为静态库

c++ - 如何修复 Turbo C++ 错误 "Cannot open include file: graphics.h: no such files or director"

android - 为android交叉编译c程序

c - 如何在一个程序中使用 sleep() 和计时器?

c - 如何从 C 获取 Linux 中当前文件 (pwd) 的路径?

c# - 如何使用 C# 以编程方式编译发布中的项目和解决方案?