Windows环境下nvcc能否与gcc/g++集成?如何配合编译Fortran代码?
问题解答
1. Windows CUDA 10.2环境下能否使用MinGW GCC 8.1.0作为C/C++宿主编译器
CUDA 10.2的Windows版本官方仅支持MSVC系列作为宿主编译器,原生没有对MinGW GCC的兼容支持。
非官方场景下可以通过指定编译参数尝试使用MinGW GCC 8.1.0:编译时给nvcc添加-ccbin参数指向你的MinGW GCC安装路径下的gcc/g++可执行文件目录,同时关闭和MSVC强绑定的编译选项。但该方案兼容性不足,复杂项目大概率会出现链接失败、功能异常等问题,生产环境不推荐使用,优先选择MSVC 2017/2019作为CUDA 10.2的配套编译器。
2. Fortran代码与nvcc配合编译的操作方法
整体逻辑是将CUDA代码、Fortran代码分别编译为目标文件/静态库,再统一链接为可执行文件,操作步骤如下:
- 第一步:用nvcc将CUDA代码(
.cu后缀)编译为目标文件,注意保持宿主编译器和后续Fortran编译器的工具链统一,不要混用MSVC和MinGW的编译产物 - 第二步:用gfortran(和你MinGW GCC 8.1.0配套)将Fortran代码编译为目标文件,建议添加
-fcray-pointer、-ffree-form(如果是自由格式Fortran)参数,同时优先用iso_c_binding模块定义和CUDA C接口匹配的函数声明,避免命名修饰、类型不兼容问题 - 第三步:用gfortran/gcc作为链接器,将所有目标文件、CUDA运行时库统一链接为最终可执行文件
编译示例命令
# 编译CUDA代码为目标文件,这里以使用MSVC为宿主编译器为例,sm版本根据你的显卡架构调整 nvcc -c kernel.cu -o kernel.obj -ccbin "你的MSVC编译器bin目录路径" -arch=sm_75 # 编译Fortran代码为目标文件 gfortran -c main.f90 -o main.obj -ffree-form -fcray-pointer # 统一链接生成可执行文件 gfortran main.obj kernel.obj -o test.exe -L"你的CUDA 10.2安装路径\lib\x64" -lcudart -lcuda
注意事项
- 整个编译流程要保持架构统一,所有代码都编译为x86或都为x64,不可混用
- 如果选择MinGW GCC作为nvcc的宿主编译器,全程不要引入MSVC编译的中间产物,避免链接不兼容问题
内容的提问来源于stack exchange,提问作者Tippsie
相关产品推荐
相关产品推荐

