How can I compile CUDA code then link it to a C++ project?
My answer to this recent question likely describes what you need.
A couple of additional notes:
- You don't need to compile your
.cu
to a.cubin
or.ptx
file. You need to compile it to a.o
object file and then link it with the.o
object files from your .cpp files compiled with g++. - In addition to putting your cuda kernel code in
cudaFunc.cu
, you also need to put a C or C++ wrapper function in that file that launches the kernel (unless you are using the CUDA driver API, which is unlikely and not recommended). Also add a header file with the prototype of this wrapper function so that you can include it in your C++ code which needs to call the CUDA code. Then you link the files together using your standard g++ link line.
I was able to resolve my issue with a couple of different posts including these ones. Don't forget that if you are using a 64 bit machine to link to the 64 bit library! It seams kind of obvious, but for clowns like me, that is something I forgot. Here is the make file that I now use... if you can digest this make file, you should be able to do what I was trying to do which was separate compilation of cuda code and other G++ code. Also keep in mind that you have to have the gcc, g++ compilers at certain versions (I am using g++-4.4 and it is working for me) Anyway, here is the make file...
all: program
program: cudacode.o
g++ -o program -L/usr/local/cuda/lib64 -lcuda -lcudart main.cpp cudacode.o
cudacode.o:
nvcc -c -arch=sm_20 cudacode.cu
clean: rm -f *.o program
Hopefully you can see that the first thing I do is compile the cudacode (that has been saved as a .cu
) using the nvcc
compiler and -c
option (also note that you may want to remove the -arch=sm_20
). This created a cudacode.o
. I then use the g++ compiler with the -o
option and link to the lib64 library and link the -lcuda
and -lcudart
libraries along with compiling my main.cpp
and then linking the cudacode.o
. Hope this helps someone!
I found that linking the compiled cuda object code with g++ can be troublesome. Try compiling it like this:
all:
nvcc cudafile.cu mainfile.cpp -o executable
clean: rm -rf *.o