c++ - 链接 qt5 库通过 cmake 自动将额外的 fPIC 标志传递给 nvcc 编译器导致错误
问题描述
我有一个基于cuda10.1、qt5的项目。我使用 cmake 来管理编译。然而,相同的 cmake 脚本在 Windows 中运行良好,但在 Linux 中,编译 .cu 文件时出现错误“Unknown option 'fPIC'”。我查看了makefile,然后发现有一个额外的错误标志“-fPIC”传递给了nvcc编译器。经过数小时的测试,我发现链接 qt5 库会自动传递导致此错误的额外 fPIC 标志。我不知道这是cmake的错误或功能吗?
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”错误,因为它无法识别 fPIC 标志。
解决方案
这是一个问题qt5.cmake
。感谢 Robert Crovella 对相关信息gitlab.kitware.com/cmake/cmake/issues/16915的评论(见上文) 。目前还没有完美的解决方案。但...
一种解决方案,如果你可以将你的项目分成一个库和一个可执行的子项目,那么你可以完全避免这个问题。尝试将所有 .cu 文件放在库子项目中,并且只在可执行子项目中链接 qt5。这是避免此问题的一种方法。
否则,您可以尝试修改 定义的变量
qt5.cmake
,该解决方案请参考cmake issue 16915。
推荐阅读
- javascript - 为什么不显示警报?
- python - Pygame:为什么代码永远不会到达第二次打印?
- python - Jupyter Notebook 在单元格中执行 Python 代码是 IPython 的哪种方法?
- angular - ImageId 未分配给角度 11 中的变量
- html - CSS 如何在一个 div 中选择特定类型的所有元素?
- sql - 提高 sql 查询性能以比较使用同一列的 2 个不同行而不是加入另一个表
- javascript - A-frame 将物理设置为变量
- express - 在 Electron 中单击时 ReactJs 无法调用 express API
- libreoffice - LibreOffice 文件保存策略:为什么?
- reactjs - 是否可以在单个反应上下文中存储两个项目,还是必须使用地图?