【问题标题】:Why does cmake add_dependencies not work for libraries with CUDA code?为什么 cmake add_dependencies 不适用于具有 CUDA 代码的库?
【发布时间】:2019-02-28 20:18:57
【问题描述】:

在 cmake 中,您可以使用 add_dependencies 来确保一个库是最新的并且在另一个库之前构建。这对于具有 C++ 源的库(示例代码中的 myLib)非常有效,但它不适用于具有 CUDA 源的库(示例代码中的 myCudaLib)。

首先,我确保所有库都已构建。当我现在更改 myLib 的文件并构建 mainExec 时,myLib 会在它之前自动重建。如果我对myCudaLib 尝试相同的操作,它只会告诉我所有项目都是最新的。

有谁知道为什么未检测到更改并且未使用 CUDA 文件重建库?

cmake_minimum_required(VERSION 3.13)

project(cmakeTest LANGUAGES CXX CUDA)

add_executable(mainExec main.cpp)

add_library(myLib foo.h foo.cpp)
add_dependencies(mainExec myLib)
target_link_libraries(mainExec PRIVATE myLib)

add_library(myCudaLib foo.cuh foo.cu)
add_dependencies(mainExec myCudaLib)
target_link_libraries(mainExec PRIVATE myCudaLib)

源文件不包含任何重要内容,只有一个空主体的函数 void foo()(或者当我更改它们以查看库是否已重建时的单个变量)。

如果重要:Windows 10、Visual Studio 2017、Cmake 3.13、Cuda 10.0

【问题讨论】:

  • 拥有target_link_libraries 会使add_dependencies 冗余。您正在更改myCudaLib 的哪个确切文件以进行观察重建?如果你在这样的改变之后构建myCudaLib库,它会被重建吗?
  • 感谢您的提示,但是如果我省略 add_dependencies,问题仍然存在(如果更改,c++ lib 会重建,cuda lib 不会)。我已经更改了两个文件 foo.cuh 和 foo.cu,都不会导致重建。我可以在更改前后手动构建所有库而不会出现问题。
  • 因此,如果您更改 foo.cuh 并要求 Visual Studio 构建 myCudaLib,那么它会重新构建库。但是,如果您更改 foo.cuh 并要求 Visual Studio 构建 mainExec,则不会重建任何内容。我是否正确理解您的情况?
  • 是的,就是这样。
  • 嗯,我对 CUDA 不是很熟悉,但是从 CMake 的角度来看,这看起来确实很奇怪。

标签: c++ cmake cuda


【解决方案1】:

Visual Studio 未检测到 CUDA 文件更改的行为是由 CUDA 10.0(显然是以前的一些版本)与 Visual Studio 2017(2015 工作正常)交互中的错误引起的。如果您的项目位于某些文件夹(C:\ProgramDataC:\Users\userName\AppData\Local)中,则不会发生这种情况。可以在 NVIDIA 论坛上找到完整的讨论 here

CUDA 10.1 修复了该错误(尚未得到 NVIDIA 确认,但似乎对论坛上的某些人有效,而且对我也有效)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    相关资源
    最近更新 更多