Windows 上的 CMake - 使用导入的目标 OpenGL::GLU 时 FindOpenGL.cmake 中的错误?

Posted

技术标签:

【中文标题】Windows 上的 CMake - 使用导入的目标 OpenGL::GLU 时 FindOpenGL.cmake 中的错误?【英文标题】:CMake on windows - bug in FindOpenGL.cmake when using imported target OpenGL::GLU? 【发布时间】:2018-08-23 13:24:58 【问题描述】:

所以我尝试在 Windows 上使用 cmake 构建 OpenGL 应用程序,但在链接到 GLU 时遇到问题。

具体来说,我正在使用 cmake 3.11 的 FindOpenGL.cmake 尝试将 OpenGL::GLU 作为导入目标引入,因为我想使用“现代”cmake 最佳实践。我的 CMakeLists.txt 有这个部分:

find_package(OpenGL REQUIRED)

if(NOT TARGET OpenGL::GLU)
    message(FATAL_ERROR "GLU could not be found")
endif(NOT TARGET OpenGL::GLU)

message(STATUS "glu: $OPENGL_glu_LIBRARY")

get_target_property(GLU_IMPORTED_LIBNAME OpenGL::GLU IMPORTED_LIBNAME)
message(STATUS "glu imported libname: $GLU_IMPORTED_LIBNAME")

...然后接近尾声:

target_link_libraries(OpenGLTest PRIVATE
    $OS_LIBRARIES
    OpenGL::GL
    OpenGL:GLU
    GLUT::GLUT
    )

它似乎正确地找到了 GLU - 通过了我对 TARGET OpenGL::GLU 的 if 检查,并且我的 STATUS 打印输出是:

 -- glu: glu32
 -- glu imported libname: glu32

将 libname 设置为“just”glu32(没有 .lib,没有路径名)似乎有点奇怪,但也许没关系...?奇怪的是,当我尝试构建/链接时,我看到了这个错误:

C:\...\LINK : fatal error LNK1104: cannot open file 'OpenGL:GLU.lib'

查看生成的 build.ninja(我正在使用 Ninja 生成器),我看到了:

build OpenGLTest.exe: ...
  LINK_LIBRARIES = opengl32.lib OpenGL:GLU.lib C:\...\freeglut.lib

所以...OpenGL::GLGLUT::GLUT 被正确地翻译成真正的路径名,但不知何故,OpenGL::GLU 目标被翻译成 OpenGL:GLU.lib,这显然是错误的。这似乎是 FindOpenGL.cmake 设置方式中的错误,或者 cmake 本身中的错误(这似乎不太可能)。

有没有其他人经历过类似的事情,或者对这里可能发生的事情有任何见解?我应该针对 cmake 提交错误报告吗?

【问题讨论】:

【参考方案1】:

您的 CMake 脚本中有错字 - 应该是 OpenGL::GLU,而不是 OpenGL:GLU

target_link_libraries(OpenGLTest PRIVATE 
    $OS_LIBRARIES OpenGL::GL
    OpenGL:GLU # single colon!
    GLUT::GLUT
)

【讨论】:

哇...那是...回想起来如此明显,令人尴尬。我想羞愧地删除我的问题,但我不想抢你的分数......非常感谢!

以上是关于Windows 上的 CMake - 使用导入的目标 OpenGL::GLU 时 FindOpenGL.cmake 中的错误?的主要内容,如果未能解决你的问题,请参考以下文章

Windows XP上的VS Code + WSL应用程序上的CMake扩展

使用 CMake 将 Qt DLL 复制到 Windows 上的可执行目录

[CMake + MinGW + Windows 10上的Clang

CMake 告诉我啥(Windows 上的错误)?

在Windows 10上的CLion / CMake中“无法找到SFML”错误?

QtCreator 1.3、Qt 4.6.2 和 cmake 在 windows 上的构建问题