如何将Makefile中CUDA_PATH定义转换为CMakeLists.txt实现?
在CMakeLists.txt中复刻Makefile的CUDA路径获取逻辑
要实现和你Makefile里CUDA_PATH = $(subst /bin/,,$(dir $(shell which nvcc)))完全一致的效果,在CMake里可以这么做:
- 先找到nvcc的可执行文件路径
find_program(NVCC_EXECUTABLE nvcc) if(NOT NVCC_EXECUTABLE) message(FATAL_ERROR "nvcc not found - make sure CUDA is installed and added to your system PATH") endif()
- 接着提取路径,推导CUDA根目录
# 先拿到nvcc所在的bin目录 get_filename_component(NVCC_BIN_DIR ${NVCC_EXECUTABLE} DIRECTORY) # 从bin目录往上走一级就是CUDA的根目录 get_filename_component(CUDA_PATH ${NVCC_BIN_DIR} DIRECTORY)
这样得到的CUDA_PATH就和Makefile输出的完全一样,比如/usr/local/cuda-11.4。
后续使用提示
你提到用过add_definitions,但要注意:
- 如果是用来加头文件搜索路径,别用
add_definitions,应该用include_directories:
include_directories(${CUDA_PATH}/include)
- 如果确实需要把
CUDA_PATH作为宏定义传给代码,推荐用add_compile_definitions(CMake 3.12及以上版本支持,比旧的add_definitions更清晰):
add_compile_definitions(CUDA_PATH="${CUDA_PATH}")
额外建议
其实CMake有官方的CUDA支持方案,比手动推导路径更可靠:
enable_language(CUDA) # 启用后,CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES会自动包含CUDA头文件路径 include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
这种方式会自动处理不同系统、不同CUDA版本的路径问题,不需要手动拼接。
内容的提问来源于stack exchange,提问作者brainfridge
相关产品推荐
相关产品推荐

