You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake编译NVHPC的nvc++程序时遇Mcuda_compiled未定义引用错误

NVHPC nvc++ CMake项目链接错误undefined reference to 'Mcuda_compiled'的解决办法

问题场景

我编写了一个测试NVHPC nvc++并行特性的简单程序:

#include <iostream>
#include <numeric>
#include <vector>

int main(int argc, char** argv)
{
  std::vector<int> numbers{1, 2, 3, 4, 5, 6, 7};
  int sum = std::accumulate(numbers.begin(),
                            numbers.end(),
                            0,
                            [](int sum, const int num) { return sum + num; }
  );

  std::cout << "sum is " << sum << '\n';
  return 0;
}

直接用命令行编译无问题:

nvc++ -g -O0  main.cpp -o main

但通过CMakeLists.txt编译时出现链接错误,错误信息为:

/usr/bin/ld: CMakeFiles/main.dir/main.cpp.o:(.init_array+0x20): undefined reference to 'Mcuda_compiled'

对应的CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.20)
project(nvhpc LANGUAGES CXX)

message(STATUS "C++ compiler is: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")

if(CMAKE_CXX_COMPILER_ID STREQUAL NVHPC)
    add_compile_options(-stdpar)
endif()


add_executable(main main.cpp)

解决方案

问题根源

-stdpar是NVHPC编译器用于启用标准并行算法的选项,它不仅会在编译阶段处理并行化代码生成,还要求链接阶段链接对应的CUDA并行运行时库。原CMake配置仅将-stdpar添加到编译选项中,未同步添加到链接选项,导致链接器找不到Mcuda_compiled等运行时符号。

修复步骤

修改CMakeLists.txt,确保-stdpar同时作用于编译和链接阶段,有两种方式可选:

方式1:针对单个目标配置

将原有的add_compile_options(-stdpar)替换为:

if(CMAKE_CXX_COMPILER_ID STREQUAL NVHPC)
    target_compile_options(main PRIVATE -stdpar)
    target_link_options(main PRIVATE -stdpar)
endif()

方式2:全局配置(针对所有目标)

如果项目中有多个可执行/库目标,可以同时添加编译和链接的全局选项:

if(CMAKE_CXX_COMPILER_ID STREQUAL NVHPC)
    add_compile_options(-stdpar)
    add_link_options(-stdpar)
endif()

补充说明

如果你的程序需要针对特定CUDA架构优化,可以在-stdpar后追加显卡架构参数,例如针对安培架构(cc80):

target_compile_options(main PRIVATE -stdpar=gpu -gpu=cc80)
target_link_options(main PRIVATE -stdpar=gpu -gpu=cc80)

内容的提问来源于stack exchange,提问作者maidamai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:15:31