已在CMake中启用CUDA,为何main.cpp无法引入CUDA头文件?
问题原因
当你启用CUDA作为项目语言时,CMake只会给**CUDA源文件(.cu)**的编译过程自动添加CUDA Toolkit的头文件路径和编译选项。但main.cpp是C源文件,由系统默认C编译器(如GCC)编译,这个编译器无法自动找到<cuda_runtime.h>的位置——因为你的test.h里直接包含了这个CUDA头文件,导致编译main.cpp时触发找不到头文件的错误。
解决方案
有两种可靠的修复方式,根据你的需求选择:
方案1:清理头文件依赖(推荐)
test.h中的函数声明void test(int *arr, int size);不需要依赖任何CUDA类型或头文件,因此可以直接移除test.h中的<cuda_runtime.h>包含,只在需要它的test.cu中保留:
修改后的test.h:
#ifndef TEST_H_ #define TEST_H_ // 移除#include <cuda_runtime.h>,函数声明无需CUDA依赖 void test(int *arr, int size); #endif // TEST_H_
这种方式最简洁,避免了C++代码不必要地依赖CUDA头文件,同时完全解决编译错误。
方案2:让C++编译过程感知CUDA头文件
如果必须在test.h中保留<cuda_runtime.h>(比如后续函数声明会用到CUDA类型),可以通过CMake显式引入CUDA Toolkit的头文件路径:
修改后的CMakeLists.txt:
cmake_minimum_required(VERSION 3.24) project(test LANGUAGES CXX CUDA) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CUDA_STANDARD 14) # 显式查找CUDA Toolkit find_package(CUDAToolkit REQUIRED) set(SOURCES ${SOURCES} test.cu ) add_executable(test main.cpp ${SOURCES}) set_target_properties(${PROJECT_NAME} PROPERTIES CUDA_ARCHITECTURE "75") # 给目标添加CUDA Toolkit的头文件路径和链接库 target_link_libraries(test PRIVATE CUDA::cudart)
target_link_libraries(test PRIVATE CUDA::cudart)会自动给C++编译过程添加CUDA头文件路径,并链接CUDA runtime库,解决找不到头文件的问题。
验证修复
重新执行构建步骤:
cd build rm -rf ./* # 清理旧构建文件 cmake .. make
此时编译应该能正常完成。
内容的提问来源于stack exchange,提问作者bickit
相关产品推荐
相关产品推荐

