是的,有办法。
关于您提供的样品:
target_link_libraries(${TARGET_NAME} opengl32 glu32)
在这种情况下,当您仅列出要链接的库时,CMake 会将它们传递给链接器,无需任何额外的工作;链接器必须找到它们。
关于CMake包含库的方式:
然而,CMake 可能会为您提供更多帮助。请看一下下面的代码片段,它代表了在 CMake 中查找库的首选方式:
#NOTE: this is a complete & working CMakeLists.txt
project(my_opengl_program)
set(TARGET_NAME ${PROJECT_NAME})
set(TARGET_SOURCES my_opengl_program.cpp my_opengl_program.h)
add_executable(${TARGET_NAME} ${TARGET_SOURCES})
find_package(OpenGL REQUIRED)
target_link_libraries(${TARGET_NAME} OpenGL::GL OpenGL::GLU)
而不是使用find_library
直接使用find_package
。它将找到您需要的库(通过使用find_library
内部)并为您设置各种有用的变量。
此外,大多数包还会定义所谓的导入库,OpenGL::GL
and OpenGL::GLU
在你的情况下,它可以用于链接。链接的美妙之处CMake 目标是您的可执行文件将从用于链接的目标继承所有相关的编译/链接要求。当然,“导入库”也是 CMake 目标:)
请注意,有NO可执行文件的附加编译/链接选项,包括目录、编译定义等。一切必需的东西都继承自OpenGL::GL
and OpenGL::GLU
.
CMake 还提供了以下软件包许多标准库(向下滚动到“查找模块”)。
关于搜索库
您可以随时使用find_library
直接,在这种情况下,您有责任满足图书馆提出的所有要求。
确定搜索库的位置可能相当复杂,并且受各种因素驱动CMake
变量以及传递给的参数find_library
。最简单的情况,当没有相关的CMAKE_*
变量发生变化,当使用基本语法调用 find_library 时,例如:
find_library(GL_LIB opengl32)
fund_library(GLU_LIB glu32)
搜索openGL32
and glu32
将被控制CMAKE_SYSTEM_PREFIX_PATH
, CMAKE_SYSTEM_LIBRARY_PATH
CMake 变量。
最后,这是完整的文档查找库, 查找包, cmake 支持的库(向下滚动到“查找模块”),目标链接库
[update]
find_library 与 find_package
有人提出了关于两者之间差异的问题find_library
and find_package
.
简而言之,这两个命令并不“竞争”,而是相互“补充”。人们可能会想find_library
作为包含库的低级接口。在此背景下,find_package
将是一个更高的界面,更容易使用。另一方面,find_package
需要库维护者或直接来自 CMake 的额外支持。
更深入地研究这个问题:
假设使用引入了一些库find_library (SOME_OTHER_LIB some_other_lib_name)
。如果找到该库,则该变量SOME_OTHER_LIB
将包含库的路径,这足以进行链接,使用target_link_libraries
.
但要真正使用该库,来源需要包括SOME_OTHER_LIB
特定标头,即另一个find_path(...)
需要引入,以定位标头,然后是target_include_directories(...)
。此外,库所需的编译选项也需要以某种方式提取,并使用引入target_compile_options(...)
当然,如果 SOME_OTHER_LIB 在多个地方使用,则所有target_include_directories
, target_compile_options
, and target_link_libraries
必须全身使用。
对于每个使用的外国库都必须重复相同的过程。
人们可以很快发现这种模式,而这正是find_package
变得方便。所有这些低级工作都对最终用户(即使用 CMake 的开发人员)隐藏,并且为她/他提供了一个干净且统一的界面。缺点是find_package
需要一种“驱动程序”来“驱动”包含外部库的过程。 CMake 直接支持的所有库都可以在cmake 模块(向下滚动到“查找模块”)。
锦上添花的是,几乎所有查找模块还创建所谓的“导入库”(OpenGL::GL
and OpenGL::GLU
在你的情况下)是 cmake 目标,包含 3rd 方库的所有要求。所有这些数据都通过链接导入库来继承,从而使代码更加简洁。
不幸的是,对于创建的导入库的命名没有“强制执行”(只是指南),因此唯一的解决方案是检查文档。为了OpenGL
模块,可以在查找OpenGL page.