为每个Qt模块创建导入的目标.应首选导入的目标名称,而不是像
Qt5<Module>_LIBRARIESCMake命令(如target_link_libraries)中那样使用变量.
它是特殊的Qt还是为所有库find_package生成导入的目标?CMake 3.0中的文档find_package说:
当找到包时,通过变量和包本身记录的导入目标提供特定于包的信息.
使用的结果
find_package是一组IMPORTED目标,或者是与构建相关信息对应的一组变量.
但我没有看到另一个FindXXX.cmake-script文档说创建导入的目标.
Com*_*sMS 16
find_package 这些天是双头野兽:
现在,这究竟意味着什么?
查找模块包是您可能最熟悉的包.它们执行一个CMake代码脚本(例如这个代码),它对函数执行一系列调用,find_library并find_path找出库的位置.
这种方法的最大优点是它非常通用.只要文件系统上有东西,我们就可以找到它.最大的缺点是它通常提供的信息比那个东西的物理位置少得多.也就是说,查找模块操作的结果通常只是一堆文件系统路径.这意味着建模诸如传递依赖或多个构建配置之类的东西是相当困难的.
如果您试图找到的东西本身是用CMake构建的,那么这就变得特别痛苦.在这种情况下,您已经在构建脚本中建立了大量的东西,现在您需要为find脚本进行艰苦的重构,以便下游项目可以使用它.
这是配置文件包闪耀的地方.与find-modules不同,运行脚本的结果不仅仅是一堆路径,而是创建了功能齐全的CMake目标.对于依赖项目,看起来依赖项已构建为同一项目的一部分.
这允许以非常方便的方式传输更多信息.明显的缺点是配置文件脚本比查找脚本复杂得多.因此,您不想自己编写它们,但让CMake为您生成它们.或者更确切地说,依赖项提供配置文件作为其部署的一部分,然后您可以通过find_package调用加载.这正是Qt5所做的.
这也意味着,如果您自己的项目是库,请考虑在构建过程中生成配置文件.这不是CMake最直接的功能,但结果非常强大.
下面简要比较两种方法在CMake代码中的外观:
查找模块样式
find_package(foo)
target_link_libraries(bar ${FOO_LIBRARIES})
target_include_directories(bar ${FOO_INCLUDE_DIR})
# [...] potentially lots of other stuff that has to be set manually
Run Code Online (Sandbox Code Playgroud)
配置文件样式
find_package(foo)
target_link_libraries(bar foo)
# magic!
Run Code Online (Sandbox Code Playgroud)
tl; dr:如果依赖项提供它们,总是更喜欢配置文件包.如果没有,请改用查找脚本.
实际上,结果并没有“魔法” find_package:该命令只是搜索适当的FindXXX.cmake脚本并执行它。
如果查找脚本设置了XXX_LIBRARY变量,则调用者可以使用该变量。
如果查找脚本创建导入的目标,则调用者可以使用这些目标。
如果 Find 脚本既不设置 XXX_LIBRARY变量也不创建导入的目标......那么,该脚本的用法会有所不同。
文档find_package描述了查找脚本的常用用法。但无论如何,您都需要查阅有关具体脚本的文档(该文档通常包含在脚本本身中)。
| 归档时间: |
|
| 查看次数: |
5499 次 |
| 最近记录: |