CMake与CUDA权限错误问题求助
先梳理下你的问题:
我正尝试构建一个结合CUDA与C代码、依赖外部库moderngpu的静态库项目。CUDA与C代码各自独立运行正常,且此前已通过make编译成功,但通过CLion使用CMake构建时,出现如下错误:
Error running 'main': Cannot run program "/home/mnemonic/Programs/myProject/bin/src/CMakeFiles/hvm.dir/cmake_device_link.o" (in directory "/home/mnemonic/P...
这个错误的核心很明确——CLion误把CUDA设备链接阶段生成的中间对象文件当成了可执行程序来运行,再结合你之前用make编译正常的情况,大概率是CMake配置或CLion运行设置的问题,以下是几个针对性的解决步骤:
先修正CLion的运行配置
cmake_device_link.o是CMake处理CUDA代码时生成的临时链接产物,根本不是可执行文件,CLion肯定是选错了运行目标:- 点击CLion右上角的运行配置下拉框,选择「Edit Configurations...」
- 在弹出的窗口里,找到当前的「main」配置,检查「Executable」字段——它现在指向的应该就是那个
.o文件,你需要把它改成项目实际生成的可执行程序(比如你源码里的main.cpp编译出来的main二进制文件,路径一般在build目录的对应子文件夹里) - 如果找不到正确的可执行文件,直接点击「+」新建一个「Application」配置,手动指定可执行文件的路径,再保存即可
检查CMakeLists.txt的CUDA相关配置
虽然make编译正常,但CMake的写法可能有细节疏漏,导致CLion识别异常:- 确保项目开头正确启用了CUDA语言支持,比如用
project(YourProjectName LANGUAGES CXX CUDA)或者单独加enable_language(CUDA) - 对于moderngpu的依赖,要明确添加头文件路径:
include_directories(/path/to/moderngpu/include),如果moderngpu需要链接静态库,还要用target_link_libraries(YourStaticLibraryTarget PRIVATE /path/to/moderngpu/lib/libmoderngpu.a) - 手动指定CUDA架构,避免CMake自动检测出错,比如你的GPU是RTX 30系列,就加
set(CMAKE_CUDA_ARCHITECTURES 86),根据自己的GPU型号调整即可
- 确保项目开头正确启用了CUDA语言支持,比如用
清理CMake缓存后重新构建
有时候旧的CMake缓存会残留错误配置,导致CLion识别混乱:- 点击CLion顶部菜单栏的「File」->「Delete CMake Cache...」
- 然后点击「Build」->「Rebuild Project」,让CMake重新生成所有构建文件,再尝试运行
终端验证排除CLion问题
如果上面的步骤都没解决,你可以手动在终端跑CMake构建,确认是CLion的问题还是CMake配置的问题:# 进入你的build目录(如果没有就新建一个) cd /home/mnemonic/Programs/myProject/bin cmake .. make # 运行生成的可执行文件 ./src/main # 这里换成你实际的可执行文件路径如果终端里能正常编译运行,那百分百是CLion的运行配置没调好,回到第一步仔细检查即可
内容的提问来源于stack exchange,提问作者user9687714

