CMake 3.0+Fortran+CUDA编译问题:Intel编译器需-fPIC生成可执行文件
解决Intel Fortran+CUDA+CMake 3.0下必须添加-fPIC的问题
这个问题其实是Intel Fortran编译器和CUDA工具链在CMake 3.0旧版支持下的特殊交互导致的——虽然常规情况下-fPIC是编译共享库时才需要的标志,但当Fortran代码和CUDA代码混合编译时,CUDA链接阶段会依赖位置无关的对象文件(比如CUDA Runtime的静态库组件本身是PIC编译的),而Intel Fortran默认生成的可执行代码是非PIC的,两者链接时就会触发报错。
针对CMake 3.0的兼容需求,你可以通过以下方式手动处理:
- 针对性添加-fPIC标志:只给Intel Fortran编译器添加该标志,避免影响其他编译器的正常行为
- 适配CMake 3.0的CUDA编译流程:利用旧版的
find_package(CUDA)和cuda_add_executable指令配合
示例CMake配置
cmake_minimum_required(VERSION 3.0) project(FortranCUDA_Demo) # 查找CUDA组件(CMake 3.0仅支持这种方式) find_package(CUDA REQUIRED) # 仅对Intel Fortran编译器添加-fPIC if(CMAKE_Fortran_COMPILER_ID MATCHES Intel) # 将-fPIC追加到Fortran全局编译标志 set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fPIC") endif() # 定义源文件 set(FORTRAN_SRCS your_main_code.f90) set(CUDA_SRCS your_cuda_kernel.cu) # 生成可执行文件(CMake 3.0的CUDA编译入口) cuda_add_executable(fortran_cuda_app ${FORTRAN_SRCS} ${CUDA_SRCS})
额外说明
如果你的代码中Fortran只是调用CUDA Runtime API而非直接链接设备代码,也可能因为Intel Fortran与CUDA Runtime库的链接规则触发这个问题——旧版CMake在处理这种跨语言链接时,没有自动为Intel Fortran注入必要的PIC编译选项,所以手动添加是最稳妥的兼容方案。
内容的提问来源于stack exchange,提问作者Raul Laasner
相关产品推荐
相关产品推荐

