CMake的add_custom_command在Windows和Linux上的输出位置是否不同?

问题描述 投票:0回答:1

我在我的一个项目中的

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}
,对吧?那么编译成功怎么会少了文件呢?

cmake cross-platform buildconfiguration cmake-custom-command
1个回答
0
投票

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目标输出文件的文件系统路径兄弟。

© www.soinside.com 2019 - 2024. All rights reserved.