我正在尝试用nvcc编译库达对象文件,并使用g++编译器编译最终的主脚本。我见过this post,但没能让我的例子奏效。我得到的错误似乎是链接错误:
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是:
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 *.omain.cpp
#include "module.h"
int main(){
return 0;
}module.cu
#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
#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发布于 2021-12-27 17:38:23
你的链接线错了。所有库(例如,-lfoo)必须在所有对象文件(例如,.o文件)之后出现在链接行的末尾。
不仅如此,它们还需要被正确地订购(但我不知道正确的顺序是什么,所以也许它们在上面是正确的)。
几乎所有的现代链接器都是“单程”链接器,这意味着它们只通过一次库,而且由于它们只在已经需要的情况下拉动符号,所以必须首先订购具有“最高级别”内容的库,以及“低级”内容跟随。
发布于 2021-12-27 17:50:46
由于MadScientist的解释,链接必须在链接行的末尾进行,在所有.o文件之后:
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 *.ohttps://stackoverflow.com/questions/70497535
复制相似问题