我在我的一个项目中的
add_custom_command()
中使用CMakeLists.txt
。我似乎已经很好地解决了在 Linux 上构建的问题,但是当我尝试在 Windows 上构建时,发生了一些奇怪的事情。
这是我项目中子目录
CMakeLists.txt
的片段:
add_executable(vectorAddMMAP modified_cuda_samples/vectorAddMMAP/vectorAddMMAP.cpp)
add_custom_command(
OUTPUT vectorAddMMAP_kernel.fatbin
COMMAND ${CMAKE_CUDA_COMPILER}
-fatbin ${CCBIN_ARGUMENT}
--generate-code arch=compute_${CMAKE_CUDA_ARCHITECTURES},code=sm_${CMAKE_CUDA_ARCHITECTURES}
-o ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/vectorAddMMAP_kernel.fatbin
${CMAKE_CURRENT_SOURCE_DIR}/modified_cuda_samples/vectorAddMMAP/vectorAdd_kernel.cu
MAIN_DEPENDENCY modified_cuda_samples/vectorAddMMAP/vectorAdd_kernel.cu
...这是我使用 MS Visual Studio 16 2019 在 2019 年的 Windows 版本上获得的输出。(为便于阅读而断开的行)
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(241,5):
warning MSB8065: Custom build for item "..\..\examples\modified_cuda_samples\vectorAddMMAP\vectorAdd_kernel.cu" succeeded,
but specified output "d:\a\cuda-api-wrappers\cuda-api-wrappers\build\examples\vectoraddmmap_kernel.fatbin" has not been
created. This may cause incremental build to work incorrectly.
[D:\a\cuda-api-wrappers\cuda-api-wrappers\build\examples\do_build_vectorAddMMAP_kernel.vcxproj]
我不明白这怎么可能。自定义命令创建
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/vectorAddMMAP_kernel.fatbin
。而add_custom_command
的相对路径的隐含目录是${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
,对吧?那么编译成功怎么会少了文件呢?
add_custom_command 的相对路径的隐含目录是
,对吗?${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
错了
有关
OUTPUT
的
add_custom_target
参数,请参阅文档,其中声明:
如果输出文件名是相对路径,则其绝对路径是通过相对于以下内容进行解释来确定的:
build 目录中的路径是首选,除非源树中的路径被提及为当前目录中其他地方的绝对源文件路径。
这只是
OUTPUT
参数。如果您只是在add_custom_command
的文档中搜索“相对”一词,您会发现那里的大多数参数都有自己的规范,大多数涉及CMAKE_CURRENT_BINARY_DIR
.
故事的寓意:始终阅读 CMake 文档,了解在给定上下文中采用的相对路径。
顺便说一句,
CMAKE_RUNTIME_OUTPUT_DIRECTORY
没有已经设置默认值。如果您尝试使用没有设置值的变量,CMake 的默认行为是仅将变量引用评估为空字符串。这可能与您的命令 appears 根据您最初认为的工作方式在您的 Linux 机器上工作的原因有关。
$<TARGET_FILE_DIR:tgt>
生成器表达式这样的东西,你可以像$<TARGET_FILE_DIR:vectorAddMMAP>/vectorAddMMAP_kernel.fatbin
一样使用它来创建一个fatbin作为你的vectorAddMMAP目标输出文件的文件系统路径兄弟。