赞
踩
find_package是一个较为复杂的命令。详情请参考最后的参考资料。我们这里只讲最基本的简明扼要的用法和原理。
我们要搜索一个名为 PackageName 的包。
find_package(PackageName)
因为对于项目来说,有些包是可选的。但有些是必要的。对于必要的,可以指定REQUIRED,这样找不到对应的包就会报错。
find_package(PackageName REQUIRED)
另外,有些包其中有许多的组件,你可以指定COMPONENTS 来只使用某些组件
find_package(PackageName COMPONENTS xxx)
find_package其实搜索的是.cmake文件。更具体地说:
这两种只要找到其中之一即可。找第一个的叫做MODULE模式,找第二个的叫做CONFIG模式。你可以指定MODULE或CONFIG关键字来指定只找某种模式的。否则是两种模式都找,先找第一个,找不到再找第二个。
这些文件里,其实设定的就是库和包含路径的位置。更具体的说,就是设置了这三个变量
<PackageName>_ROOT
或者是
<PackageName>_DIR
CMAKE_MODULE_PATH = /path/to/FindXXX.cmake
这些FindXXX.cmake或者XXXConfig.cmake的路径通常第三方库的作者会放在自己项目的cmake目录下。
CMAKE_PREFIX_PATH
,例如C:\Program Files\CMake\share\cmake-3.23\Modules
PATH
环境变量,比如/usr/local/
find_package(PackageName [PATHS path1 [path2 ... ]])
或者将PATHS
关键字替换为HINTS
总之,一共有九种搜索路径,详情请参考cmake官方文档
if(XXX_FOUND)
add_executable(main main.cpp)
target_link_libraries(main XXX::XXX)
endif()
这个双冒号前面的是包的命名空间,后面的是包的组件。具体的要看包提供者。如果不知道,可以使用vcpkg install xxx来查看。例如
(base) PS E:\codes\vcpkg> vcpkg install freeglut
find_package(GLUT REQUIRED)
target_link_libraries(main PRIVATE GLUT::GLUT)
关键就在于设定那三个变量
具体可以参考官方写的FindZLIB.cmake
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。