I’ve made a simple “build rule” for .cu files for Visual Studio 2005. This makes it so you don’t have to manually define a custom build rule for every CUDA file in your project.
It simply invokes nvcc on the file and forwards the C/C++ options to cl.exe. You can also specify whether or not to compile emulation code.
To install the rule:
unzip cuda-build-rule.zip
right-click on your project in Visual Studio 2005
click Custom Build Rules…
click Find Existing…
browse to cuda.rules
check the box next to the CUDA listing in the Available Rule Files pane
click ok
Now you can compile .cu files in the same way as .c/.cpp.
Unfortunately, I don’t see a way to easily fill in the default options for the different Debug,EmuDebug, etc configurations, so for now you have to do it by hand. The way I dealt with it is to make a template CUDA project, and fill in the defaults. I’ve also attached this template. To use it, you should have CUDA_INC_PATH, CUDA_LIB_PATH, CUDA_BIN_PATH, and CUDA_LIBRARIES defined in your environment.
Extending the rules to support the rest of the nvcc options would be simple but tedious, but if anyone does, please post it here so we can all use it! :)
Thanks for contributing this build rule, but I’ve been having some problems with it. I set up the paths that I need, including setting $(CUDA_LIBRARIES) to C:\CL, which is where I threw the the lib files. When I go to compile, it goes fine until it hits linking where it throws this error:
LINK : fatal error LNK1104: cannot open file 'C:\CL.obj'
This error is usually related to extra whitespace in a path name, however my path is set to only C:\CL. I tried many variations on this, with no success. I was just wondering if anyone else encountered this problem, and if it actually was related to something else.
One problem I ran into was mixing .cpp and .cu files in the build.
The linker only seems to catch the .obj file from the nvcc step.
Adding the .cpp’s .obj file under the project’s property “Linker->Input->Add Module to Assembly” forced the linker to include the .obj file in the build.
I don’t think I’ve run into this problem, somehow msvc just figures out the linker needs to include any .obj it finds in \Release.
Though, I have run into problems with including .cu & .cpp files with the same base name in my project. For example, foo.cpp & foo.cu would only produce one .obj; whichever was compiled later. My workaround was to compile foo.cu → foo.cuda.obj. You can make this change pretty easily by modifying the build line.
This should be fixable by having .cpp objs and .cu objs go to separate output directories, or you could just make your rule compile *.cu files to *.cu.obj or something like that.
Hi, I’m new to CUDA. I managed to compile my source code by nvcc, but I kept getting this error message when I was trying to link by Microsoft’s C++ Compiler:
main.obj : error LNK2019: unresolved external symbol “void __cdecl saxpy(float *,float const *,float,unsigned int)” (?saxpy@@YAXPAMPBMMI@Z) referenced in function _main
This both happened when I try to link via VS IDE and command prompt. Can somebody help me?
Thank you very much.
BTW, Jared’s custom build rule is indeed very helpful. Nice work, Jared!
I have a huge solution with 2 projects. and now I would like to use cuda to accelerate my program. I use the rule file to compile my .cu file, but there’s a error message: (xx_cuda.cu is my file name)
Compiling…
Catastrophic error: could not open source file “xx_cuda.cu”
1 catastrophic error detected in the compilation of “xx_cuda.cu”.
Compilation terminated.
Hi,
How i encounter another error.
I’ve added CUDA\include ,CUDA\lib, SDK\common\lib directories in the Options menu. and added the Additional Dependences in the Project Properties menu with cuda.lib, cudart.lib, cutil32.lib…
and here is my error message:
error LNK2019: unresolved external symbol _funct001 referenced in function _write_stuff
It seems like there’s a linking problem, but i’ve no idea how to solve it.
(all my source code is composed in C)
Does anyone know how to solve it?
Thank you!!
In order to open win32-console-app-cuda-msvc2005.vcproj
you first have to edit it in a text editor and change
to reflect the correct path…since you have named the archive with underscores, most people who simply extract it to “cuda_build_rule” will have an error when they try to open.
Thx for sharing the build rule. But I encounter an error when compiling:
‘nvcc.exe’ is not recognized as an internal or external command. Can anyone tell me how to solve it?
Thx.