c++ - 链接 qt5 库通过 cmake 自动将额外的 fPIcflags传递给 nvcc 编译器,导致错误

标签 c++ qt cmake cuda

我有一个基于cuda10.1、qt5的项目。我使用 cmake 来管理编译。然而,相同的 cmake 脚本在 Windows 中工作正常,但在 Linux 中,我在编译 .cu 文件时收到错误“未知选项‘fPIC’”。我查看了 makefile,然后发现有一个额外的错误标志“-fPIC”传递给了 nvcc 编译器。经过数小时的测试,我发现链接 qt5 库会自动传递额外的 fPIcflags,从而导致此错误。我不知道这是cmake的bug还是特性?

cmake_minimum_required(VERSION 3.10)   
project(PyPhysLeo LANGUAGES CXX CUDA)    

find_package(Qt5 COMPONENTS Core Widgets)        
if(Qt5_FOUND)
    message("Find QT5")
    link_libraries(Qt5::Widgets Qt5::Core Qt5::Gui)     
endif()

set(CMAKE_CXX_STANDARD 14 CACHE STRING "CXX STANDARD VERSION 11,14,17")          
set(CMAKE_POSITION_INDEPENDENT_CODE ON)        
set(CMAKE_CUDA_SEPARABLE_COMPILATION ON CACHE BOOL "DEFAULT SET SEPERABLE COMPILATION MODE") 
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -arch=sm_60") 

include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE})   

add_executable(test test.cu)

如果您使用任何示例 cuda 代码尝试上述 cmake 脚本,您将收到“nvcc fatal”错误,因为它无法识别 fPIcflags。

最佳答案

这是qt5.cmake的问题。感谢 Robert Crovella 对相关信息的评论(见上文)gitlab.kitware.com/cmake/cmake/issues/16915 。目前还没有完美的解决方案。但是...

  1. 一个解决方案是,如果您可以将项目分为一个库和一个可执行子项目,那么您就可以完全避免该问题。尝试将所有 .cu 文件放入库子项目中,并仅在可执行子项目中链接 qt5。这是避免此问题的一种方法。

  2. 否则,您可以尝试修改qt5.cmake定义的变量,解决方案请引用cmake issue 16915 .

关于c++ - 链接 qt5 库通过 cmake 自动将额外的 fPIcflags传递给 nvcc 编译器,导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56199636/

相关文章:

c++ - 此代码的浮点错误有人可以帮助我吗

c++ - 自定义 QComboBox

c++ - 如何使用 C++ 编写我自己的下载管理器?

cmake - 如何为包含的目录设置 BUILD_SHARED_LIBS

cmake - cooperative_groups::this_grid() 导致任何 CUDA API 调用返回 'unknown error'

cmake - 在 Ubuntu 20.04 上构建 QtQuick 应用程序需要哪些开发包?

c++ - 当 ios::sync_with_stdio(0) 和 cin.tie(0) 写在循环内时奇怪行为的解释

c# - 如何覆盖视频的 i 帧?

c++ - 以二进制模式读取 char 的问题,╡

qt - Qt Quick QML 中的位图字体