在64位机器中编译出错No architectures to compile for (ONLY_ACTIVE_ARCH...解决方法

项目在非64位机器中编译能顺利通过,但是在64位模拟器编译会报出错误

No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).


解决办法:


把Build Active Architecture Only 改为NO

<think>我们正在处理一个CMake构建错误错误信息指向CUDA编译问题。用户提供的错误信息片段是:"CMake Errorat darknet_ros_lib_generated_crop_layer_kernels.cu.o.Release.cmake:220(message):Error generating/home/oem/catkin_ws/build/darknet_ros/darknet_ros/CMakeFiles/darknet_ros_lib.dir/__/darknet/src/./darknet_ros_lib_generated_crop_layer_kernels.cu.o" 同时用户还提到:“这种问题,我认为是gpu或者是cuda的问题。这个库的需求gpu较低,而目前使用的过高。” 此外,用户还提供了一个类似的错误信息: "CMakeError relion_jaz_gpu_util_generated_test00.cu.omessage Errorgenerating"根据这些信息,我们可以推断用户遇到了CUDA代码编译失败的问题。可能的原因包括: 1. CUDA工具包版本与项目要求不匹配。 2. GPU架构与代码编译设置不匹配(比如代码针对较旧的架构编译,而当前GPU较新,或者相反)。 3.系统缺少必要的依赖项。 我们将逐步分析并提供解决方案。###步骤1:检查CUDA版本兼容性项目可能要求特定版本的CUDA。使用以下命令检查当前安装的CUDA版本:```bashnvcc --version``` 然后检查项目文档(如README或CMakeLists.txt)中指定的CUDA版本要求。如果版本不匹配,考虑安装指定版本。###步骤2:检查GPU架构设置CMake在编译CUDA代码时,需要知道目标GPU架构。通常,CMakeLists.txt中会通过`-arch=sm_XX`指定。如果未指定或指定错误,可能导致编译失败。 查看项目构建目录中生成的CUDA编译命令,通常在`CMakeFiles/<target>.dir/build.make`或类似文件中。或者,在CMake配置时,可以添加以下选项来查看详细编译命令: ```bashcmake-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ..``` 然后重新构建,查看编译`crop_layer_kernels.cu`时使用的确切命令。 常见的GPU架构代号(根据你的GPU型号选择):- Fermi: sm_20- Kepler: sm_30, sm_35, sm_37-Maxwell:sm_50,sm_52,sm_53- Pascal: sm_60, sm_61,sm_62- Volta:sm_70,sm_72- Turing: sm_75- Ampere:sm_80,sm_86,sm_87- AdaLovelace:sm_89,sm_90如果项目配置的架构高于你的GPU,或者低于CUDA工具包默认支持的最低架构,则需要调整。 在CMake中,可以通过设置`CMAKE_CUDA_ARCHITECTURES`变量来指定目标架构。例如,针对Pascal架构(如GTX1080): ```cmakeset(CMAKE_CUDA_ARCHITECTURES "60") ```或者在配置时传递: ```bashcmake-DCMAKE_CUDA_ARCHITECTURES=60..```###步骤3:检查依赖项确保安装了项目所需的所有依赖项。特别是,CUDA工具包需要与显卡驱动兼容。使用`nvidia-smi`检查驱动版本,并确保其支持当前CUDA版本。###步骤4:清理并重新构建有时,构建目录中的残留文件可能导致问题。尝试清理构建目录并重新构建: ```bashrm-rfbuildmkdir buildcd buildcmake ..make``` ###步骤5:查看完整错误日志错误信息中提到的文件`darknet_ros_lib_generated_crop_layer_kernels.cu.o.Release.cmake`在构建目录中。打开该文件,查看第220行附近的内容,可能会提供更具体的错误原因。 ###步骤6:考虑GPU计算能力过低或过高用户提到“这个库的需求gpu较低,而目前使用的过高”。这可能意味着:-项目代码针对旧GPU编写,而你的GPU较新,但编译时没有指定新架构,导致编译出的代码无法运行(但通常编译不会失败,除非代码使用了新架构不支持的特性)。 -或者,你的GPU计算能力低于项目要求的最低值。这时,编译会失败,因为nvcc无法为不支持的架构生成代码。 确定你的GPU计算能力(通过`nvidia-smi`查询GPU型号,然后查找其计算能力),并确保在CMake中设置正确的架构。 ###针对用户提供的第二个错误信息"CMakeError relion_jaz_gpu_util_generated_test00.cu.omessage Errorgenerating"同样,以上步骤适用。注意,不同的项目(darknet_ros和relion_jaz)可能要求不同的CUDA配置。 ###总结解决方案1.确认CUDA版本和驱动版本兼容。 2.明确GPU计算能力,并在CMake中正确设置架构。3.检查项目依赖并确保满足。 4.清理构建并重新尝试。 5.查看详细日志定具体错误。 如果问题仍然存在,请提供以下信息:- CUDA版本(`nvcc --version`) -GPU型号(`nvidia-smi`)-操作系统版本-项目来源(是开源项目吗?如果是,提供链接)这样我们可以进一步帮助分析。§§相关问题§§1.如何查询GPU的计算能力? 2.如何在同一台机器上安装多个CUDA版本? 3. CMake中如何为不同的目标设置不同的CUDA架构?4.遇到CUDA编译错误时,如何获取更详细的错误信息?</think>### CMake CUDA编译错误分析与解决 您遇到的CMake错误(`Error generating [filename].cu.o`)是典型的CUDA编译问题,通常由GPU架构不匹配、CUDA版本冲突或环境配置错误引起。根据引用[^1]的线索("库的需求GPU较低,而目前使用的过高"),核心问题可能是**目标GPU架构与项目要求不匹配**。 #### 解决步骤: 1. **确认GPU计算能力** 执行命令查看GPU型号和计算能力: ```bash nvidia-smi --query-gpu=name,compute_cap --format=csv ``` 输出示例: `GeForce RTX 3080, 8.6` 记录计算能力值(如`8.6`对应`sm_86`) 2. **设置目标GPU架构** 在CMakeLists.txt中添加架构指定(示例): ```cmake # 针对计算能力7.5的GPU set(CMAKE_CUDA_ARCHITECTURES "75") ``` 或配置时指定: ```bash cmake -DCMAKE_CUDA_ARCHITECTURES=75 .. ``` 3. **检查CUDA版本兼容性** 验证项目要求的CUDA版本: ```bash # 查看项目CMake需求 grep "CUDAToolkit" CMakeLists.txt # 检查当前CUDA版本 nvcc --version ``` 4. **清理构建缓存** 删除构建目录并重新配置: ```bash rm -rf build/* cmake -B build -DCMAKE_CUDA_ARCHITECTURES=<your_arch> .. ``` 5. **验证驱动兼容性** 确保NVIDIA驱动支持当前CUDA版本: ```bash cat /proc/driver/nvidia/version nvidia-smi # 查看CUDA Version项 ``` #### 常见架构映射表: | GPU世代 | 架构代号 | 计算能力 | |-------------|---------|---------| | Pascal | sm_60 | 6.0-6.2 | | Volta | sm_70 | 7.0-7.2 | | Turing | sm_75 | 7.5 | | Ampere | sm_80 | 8.0+ | > 提示:若项目要求旧架构(如`sm_50`),而您的GPU是Ampere(`sm_80`),需在CMake中向下兼容设置:`set(CMAKE_CUDA_ARCHITECTURES "50;80")`[^1] #### 验证解决方案: ```bash cmake --build build --verbose | grep nvcc ``` 观察输出是否包含正确的`-arch=sm_XX`参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值