【问题标题】:CMake passes all gcc flags to nvcc as wellCMake 也将所有 gcc 标志传递给 nvcc
【发布时间】:2019-11-14 10:26:47
【问题描述】:

我的项目使用 cuda 内核作为一个小模块,需要 nvcc 进行编译。在编译期间,cmake 还将用于 gcc 的相同链接器和编译器标志传递给 nvcc。在我的特殊情况下,我收到以下错误。

nvcc fatal   : Unknown option 'Wl,--no-as-needed'

按照this线程中接受的答案,我设法删除了需要nvcc的目标的编译器标志,如下所示。

get_target_property(_target_cxx_flags target_that_needs_nvcc COMPILE_OPTIONS)
list(REMOVE_ITEM _target_cxx_flags "-fcolor-diagnostics")

使用它,我避免了由于错误的编译器标志而导致的错误,如下所示:

nvcc fatal   : Unknown option 'fdiagnostics-color'

但我不能使用相同的过程来删除链接器标志,因为get_target_property 只获取编译器标志而不是链接器标志。

我正在寻找一种解决方案,仅针对一个目标编译禁用链接器标志。

预期的 cmake 最低版本是VERSION 3.0

【问题讨论】:

  • 许多目标属性可能包含您要删除的标志。你试过LINK_FLAGSLINK_OPTIONS 吗?有一个完整的目标属性列表here。也许,他们在INTERFACE_LINK_OPTIONS

标签: c++ gcc cmake compiler-flags linker-flags


【解决方案1】:

删除您不想要的标志的另一种方法是一开始就不要添加它们。您可以使用生成器表达式来指定语言。例如:

add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:${my_cxx_flags}>")
add_compile_options("$<$<COMPILE_LANGUAGE:CUDA>:${my_cuda_flags}>")

我知道你问的是链接器标志而不是编译器标志,但希望这可能会让你朝着有用的方向前进。

【讨论】:

  • 感谢您的建议。不幸的是,我自己并没有在我的 CMakeLists.txt 文件中设置这些标志。我从根 CMakeLists.txt 继承了这些,我试图不篡改它。
【解决方案2】:

我认为您正在寻找的是关闭标志从 gcc 到 nvcc 的传播。 查看 find cuda 模块中旧版 cuda 支持变量中的选项 CUDA_PROPAGATE_HOST_FLAGS

【讨论】:

  • 感谢您指出CUDA_PROPAGATE_HOST_FLAGS。它有助于删除编译器标志(我不再需要get_target_property 来删除fdiagnostics-color)。不幸的是,它没有对链接器标志做任何更改,我的问题仍然存在。
猜你喜欢
  • 2019-04-14
  • 2020-10-11
  • 1970-01-01
  • 2020-04-12
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
相关资源
最近更新 更多