首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用g++编译器与CUDA对象文件进行Makefile链接

使用g++编译器与CUDA对象文件进行Makefile链接
EN

Stack Overflow用户
提问于 2021-12-27 15:39:46
回答 2查看 413关注 0票数 0

我正在尝试用nvcc编译库达对象文件,并使用g++编译器编译最终的主脚本。我见过this post,但没能让我的例子奏效。我得到的错误似乎是链接错误:

代码语言:javascript
复制
nvcc -c -g -I -dlink -I/usr/local/cuda-11/include -I. -L/usr/local/cuda-11/lib64 -lcudart -lcurand module.cu -o module.o 
g++ -I/usr/local/cuda-11/include -I. -L/usr/local/cuda-11/lib64 -lcudart -lcurand module.o main.cpp -o main
module.o: In function `call_kernel()':
/home/ubuntu/Desktop/CUDA/MPI&CUDA/module.cu:16: undefined reference to `__cudaPushCallConfiguration'
module.o: In function `__cudaUnregisterBinaryUtil()':
/usr/local/cuda-11/include/crt/host_runtime.h:259: undefined reference to `__cudaUnregisterFatBinary'
module.o: In function `__nv_init_managed_rt_with_module(void**)':
/usr/local/cuda-11/include/crt/host_runtime.h:264: undefined reference to `__cudaInitModule'

我做错什么了?我知道我可以简单地用main.cpp编译nvcc,但这是我不想要的,因为在我的问题中,以后我会用mpicxx替换g++,并在nvcc脚本中包含MPI代码。

我的makefile是:

代码语言:javascript
复制
INC := -I$(CUDA_HOME)/include -I.
LIB := -L$(CUDA_HOME)/lib64 -lcudart -lcurand
CUDAFLAGS=-c -g -I -dlink $(INC) $(LIB)

all: main

main: module.o
    g++ $(INC) $(LIB) module.o main.cpp -o main

module.o: module.cu module.h 
    nvcc -c -g -I -dlink $(INC) $(LIB) module.cu -o module.o 

clean: 
    rm -rf *.o

main.cpp

代码语言:javascript
复制
#include "module.h"

int main(){

    return 0;
}

module.cu

代码语言:javascript
复制
#ifdef __CUDACC__
#define CUDA_GLOBAL __global__
#else
#define CUDA_GLOBAL
#endif

#include <cuda.h>
#include "module.h"

CUDA_GLOBAL
void kernel(){

}

void call_kernel(){
    kernel<<<1,1>>>();
}

模组.h

代码语言:javascript
复制
#ifndef _MODULE_H_
#define _MODULE_H_

#ifdef __CUDACC__
#define CUDA_GLOBAL __global__
#else
#define CUDA_GLOBAL
#endif

#include <numeric>
#include <cuda.h>

CUDA_GLOBAL
void kernel();

void call_kernel();

#endif
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-27 17:38:23

你的链接线错了。所有库(例如,-lfoo)必须在所有对象文件(例如,.o文件)之后出现在链接行的末尾。

不仅如此,它们还需要被正确地订购(但我不知道正确的顺序是什么,所以也许它们在上面是正确的)。

几乎所有的现代链接器都是“单程”链接器,这意味着它们只通过一次库,而且由于它们只在已经需要的情况下拉动符号,所以必须首先订购具有“最高级别”内容的库,以及“低级”内容跟随。

票数 2
EN

Stack Overflow用户

发布于 2021-12-27 17:50:46

由于MadScientist的解释,链接必须在链接行的末尾进行,在所有.o文件之后:

代码语言:javascript
复制
INC := -I$(CUDA_HOME)/include -I.
LIB := -L$(CUDA_HOME)/lib64 -lcudart -lcurand

all: main

main: module.o
    mpicxx module.o main.cpp -o main $(INC) $(LIB)

module.o: module.cu module.h 
    nvcc -c -g module.cu -o module.o -I -dlink

clean: 
    rm -rf *.o
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70497535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档