Linux 编译/链接CUDA和CPP源文件 我正在使用一个既使用C++源代码又使用CUDA的示例程序。这是我的四个源文件的基本内容

Linux 编译/链接CUDA和CPP源文件 我正在使用一个既使用C++源代码又使用CUDA的示例程序。这是我的四个源文件的基本内容,linux,compiler-construction,linker,cuda,g++,Linux,Compiler Construction,Linker,Cuda,G++,matrixmul.cu(主CUDA源代码): matrixmul.h(matrixmul_gold.cpp文件的头) assist.h(助手功能) 我正在尝试编译和链接这些文件,以便它们能够正常工作。到目前为止,我可以使用以下方法编译matrixmul_gold.cpp: g++ -c matrixmul_gold.cpp 我可以使用以下方法编译CUDA源代码而不出错: nvcc -I/home/sbu/NVIDIA_GPU_Computing_SDK/C/common/inc -L/hom

matrixmul.cu(主CUDA源代码):

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

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的开头缺少了一个
外部“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.cu
matrixmul_gold.o
的名为
matrimul
的可执行二进制文件和cutil库(nvcc将隐式链接CUDA运行库和CUDA驱动程序库).

通常,您将使用您正在使用的编译器编译包含链接应用程序的主子程序的代码。在这种情况下,
.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.cu
matrixmul_gold.o
的名为
matrimul
的可执行二进制文件和cutil库(隐式nvcc也将链接CUDA运行库和CUDA驱动程序库)。

这个解释对我来说是一个概念,而不是你。第一个g++命令成功运行,但第二个nvcc编译器命令返回以下错误:
/tmp/tmpxft_0000187a_00000000-13_matrixmul.o:在函数“main”中:tmpxft_0000187a_00000000-1_matrixmul.cudafe1.cpp:(.text+0xbc8):未定义对“computeGold”集合的引用2:ld返回1退出状态
@user1644184有点可能您没有告诉我们全部情况。请用
nm matrixmul_gold.o matrixmul.o|grep computeGold
@EmployeedRussian的输出更新您的问题,我用要求的信息更新了文章的结尾。我试图提供重要的代码片段;明天我可以发布其余的。@ USE1644 184:C++:代码:它在
matrixmul_gold.o
中的存在与您提供的源代码片段不一致(其中显然包含
extern“C”
matrixmul.h
中的
。结论:您要么修改了
matrixmul.h
,要么有多个副本,但使用了错误的副本。@EmployeedRussian:可能并不矛盾。
matrixmul\u gold.cpp
缺少外部“C”在代码< > CopyToGeAs/Cuth>的定义中,这将导致C++函数的链接,并导致链接过程中的错误。这个解释对我来说是一个概念,而不是你。第一个G+命令成功地工作了,但是第二个NVCC编译器命令返回了以下错误:<代码> /TMP/TMPXFTTY00 00 187Ay0000000-13_matrixmul.o:在函数“main”中:tmpxft_0000187a_00000000-1_matrixmul.cudafe1.cpp:(.text+0xbc8):对“computeGold”集合的未定义引用2:ld返回1退出状态@user1644184有点可能您没有告诉我们全部情况。请使用nm matrixmul_gold.o matrixmul.o | grep computeGold@EmployeedRussian的输出更新您的问题,我用请求的信息更新了帖子的结尾我试图提供重要的代码片段,我可以在明天发布。@ Us1616184:<代码>,OS.P11GoPFPFPKFS1IIII/CODE >是一个C++的名字。它在代码> MatRXMuleGoal.O./C>中的存在与您提供的源代码不一致(显然有<代码>外部”C”。
matrixmul.h
中的。结论:您要么修改了
matrixmul.h
,要么有多个副本,但使用了错误的副本。@EmployeedRussian:可能并不矛盾。
matrixmul\u gold.cpp
缺少外部“C”<代码> > CopyToGeAs/Cuth>的定义。这将导致该函数的C++链接,并导致链接过程中出现错误。因为NVCC调用不生成,所以它不会有一个MyRXMUL对象,它只是从临时对象编译并链接到可执行文件。问题是名称的篡改。您的compute\u gold定义缺少外部“C”,因此您在对象文件中获得C++链接,但后来告诉编译器希望C链接。更改一个或另一个……不会释放MyRXMUL对象,因为NVCC调用不生成一个,它只是从临时对象编译并链接到可执行文件。问题是名称的修改。PUTEJOGOD定义缺少一个<代码>外部“C”<代码>,因此您在对象文件中获得C++链接,但后来告诉编译器期望C链接。
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
$ 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