如何防止cmake链接到libcudart.so?

如何防止cmake链接到libcudart.so?,cuda,cmake,Cuda,Cmake,我有一个CUDA程序CUDA_test.cc,我想在没有CUDA设备的机器上运行,在这种情况下,它将在cpu上而不是gpu上执行算法。 从命令行来看,这相当简单: machine-with-cuda$ nvcc -ccbin g++ -o cuda_test cuda_test.cc machine-without-cuda$ ./cuda_test You don't have a CUDA device 但是,我需要使用cmake,因为我的程序将包含在使用cmake的现有库中。CGED总

我有一个CUDA程序CUDA_test.cc,我想在没有CUDA设备的机器上运行,在这种情况下,它将在cpu上而不是gpu上执行算法。 从命令行来看,这相当简单:

machine-with-cuda$ nvcc -ccbin g++ -o cuda_test cuda_test.cc
machine-without-cuda$ ./cuda_test 
You don't have a CUDA device
但是,我需要使用cmake,因为我的程序将包含在使用cmake的现有库中。CGED总是用-rDrase/Ur/Prase/CuDa/Lb64/LbcUdARDE调用C++,因此,我最终得到了一个与LbcUdARART链接的可执行文件。
machine-with-cuda$ cat CMakeLists.txt 
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
FIND_PACKAGE(CUDA)
SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -ccbin g++")
CUDA_ADD_EXECUTABLE(cuda_test cuda_test.cc)

machine-with-cuda$ make
...
/usr/bin/c++       CMakeFiles/cuda_test.dir/cuda_test.cc.o  -o cuda_test -rdynamic /usr/local/cuda/lib64/libcudart.so -Wl,-rpath,/usr/local/cuda/lib64 
...

machine-without-cuda$ ./cuda_test
error while loading shared libraries: libcudart.so.6.5: cannot open shared object file: No such file or directory
请注意,即使在编译.cu文件而不是.cc文件时,我仍然会得到一个链接到libcudart.so的可执行文件

如何防止cmake链接到libcudart.so?或者,是否有其他方法确保即使未安装cuda,我的程序也能运行

非常感谢

创建一个CUDA程序,该程序即使在没有GPU的机器上也能正确运行,因此没有CUDA,它将包括libcudart提供的CUDA运行时

为此,有两种可能的方法:

如果您想让应用程序与CUDA运行时库(即linux上的libcudart.so或windows上的cudart.lib/cudart.dll)进行动态链接,则应将应用程序与相应的库捆绑在一起。是的,重新分发这些库

或者,您可以使用libcudart,并且不需要单独的捆绑或重新分发


使用上述任何一种方法,您的应用程序都将运行,例如使用cudaGetDeviceProperties或cudaGetDeviceCount。如果对库的第一个查询抛出错误,那么此时通常的响应是没有正确的CUDA安装,因此您的代码将采用非CUDA代码路径。

谢谢。使用CUDA运行时库重新分发我的应用程序似乎是我的最佳选择。