windows 上的 CMake - 使用导入的目标 OpenGL::GLU 时 FindOpenGL.cmake 中的错误?
CMake on windows - bug in FindOpenGL.cmake when using imported target OpenGL::GLU?
所以我正在尝试在 windows 上使用 cmake 来构建 OpenGL 应用程序,但我在 link 到 GLU 时遇到了问题。
具体来说,我正在使用 cmake 3.11 的 FindOpenGL.cmake 尝试引入 OpenGL::GLU 作为导入目标,因为我想使用 "modern" 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,没有路径名)似乎有点奇怪,但也许这很好......?奇怪的是,当我尝试构建 / link 时,我看到了这个错误:
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::GL
和 GLUT::GLUT
被正确地翻译成真实的路径名,但不知何故,OpenGL::GLU
目标被翻译成 OpenGL:GLU.lib
,这显然是错误的。这似乎是 FindOpenGL.cmake 设置方式的错误,或者 cmake 本身的错误(似乎不太可能)。
有没有其他人经历过类似的事情,或者对这里可能发生的事情有任何了解?我应该针对 cmake 提交错误报告吗?
您的 CMake 脚本中有错字 - 应该是 OpenGL::GLU
,而不是 OpenGL:GLU
:
target_link_libraries(OpenGLTest PRIVATE
${OS_LIBRARIES} OpenGL::GL
OpenGL:GLU # single colon!
GLUT::GLUT
)
所以我正在尝试在 windows 上使用 cmake 来构建 OpenGL 应用程序,但我在 link 到 GLU 时遇到了问题。
具体来说,我正在使用 cmake 3.11 的 FindOpenGL.cmake 尝试引入 OpenGL::GLU 作为导入目标,因为我想使用 "modern" 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,没有路径名)似乎有点奇怪,但也许这很好......?奇怪的是,当我尝试构建 / link 时,我看到了这个错误:
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::GL
和 GLUT::GLUT
被正确地翻译成真实的路径名,但不知何故,OpenGL::GLU
目标被翻译成 OpenGL:GLU.lib
,这显然是错误的。这似乎是 FindOpenGL.cmake 设置方式的错误,或者 cmake 本身的错误(似乎不太可能)。
有没有其他人经历过类似的事情,或者对这里可能发生的事情有任何了解?我应该针对 cmake 提交错误报告吗?
您的 CMake 脚本中有错字 - 应该是 OpenGL::GLU
,而不是 OpenGL:GLU
:
target_link_libraries(OpenGLTest PRIVATE
${OS_LIBRARIES} OpenGL::GL
OpenGL:GLU # single colon!
GLUT::GLUT
)