【发布时间】: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 的角度来看,这看起来确实很奇怪。