使用 CMake 为 CUDA 可执行文件设置 Win32 选项时出错

Error setting Win32 option for CUDA executable using CMake

我正在将 CUDA 支持构建到我拥有的 CMake 项目中,但是在尝试将可执行文件类型设置为 WIN32 时出现了一个非常奇怪的错误。

在使用 CUDA 之前,我使用 cmake 命令添加我的可执行文件:

add_executable(${BINARY_NAME} WIN32 ${SOURCES})

效果很好。然后,为了添加 CUDA 支持,我将这一行更改为:

cuda_add_executable(${BINARY_NAME} WIN32 ${SOURCES})

这会出错,因为 CMake 错误地将 WIN32 解析为源文件。具体错误为:

Cannot find source file:

WIN32  

Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx

当我尝试调试它时,我查看了发生错误的 CMake FindCUDA.cmake 文件,我可以看到它无法将 WIN32 拆分为宏 CUDA_GET_SOURCES_AND_OPTIONS 中的 cmake 选项。在此函数中,它遍历 cuda_add_executable 的参数并与字符串 "WIN32"、"MACOSX_BUNDLE"、... 进行比较,它期望作为选项但在 WIN32 的比较中失败,因为它是作为 CMake 变量自动设置为 1/true。

我可以避免这个错误,但是在调用 cuda_add_executable 之前使用 unset(WIN32) 然后在之后重置它但是考虑到

  1. 网上没有关于此错误的任何信息,表明这不是一个常见问题
  2. CMake documentation
  3. 推荐使用WIN32

虽然我可以通过一些小技巧来避免这个错误,但我不想让自己在未来遇到更大的失败,因为我认为我在设置中做错了什么,尽管 CMake 本身有将 WIN32 设置为变量。有谁知道问题出在哪里?

这是 FindCUDA 模块中的错误。我安装了存在此错误的 CMake 2.8.12.1,以及已修复的 CMake 3.1。因此,一种解决方案是升级到修复此问题的 CMake 版本。

如果这不适合您,这里有一个解决方法。在 add_executable 调用中指定 WIN32 实际上所做的就是将目标上的 属性 WIN32_EXECUTABLE 设置为 true。您也可以手动执行此操作,而不是使用 WIN32:

cuda_add_executable(${BINARY_NAME} ${SOURCES})
set_property(TARGET ${BINARY_NAME} PROPERTY WIN32_EXECUTABLE TRUE)