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
相关产品推荐
相关产品推荐

