在 CMake 中,包是一个外部库(或工具),可以使用脚本(与 CMake 捆绑在一起或由其他人编写)来定位它。
find_package 命令运行该脚本。当找到一个包时,脚本会设置一些变量指向包含目录、要链接的库等。
Postgres 的脚本包含在 CMake 中,因此应该可以执行以下操作:
# This command attempts to find the library, REQUIRED argument is optional
find_package(PostgreSQL REQUIRED)
# Add include directories to your target. PRIVATE is useful with multi-target projects - see documentation of target_include_directories for more info
target_include_directories(MyTarget PRIVATE ${PostgreSQL_INCLUDE_DIRS})
# Add libraries to link your target againts. Again, PRIVATE is important for multi-target projects
target_link_libraries(MyTarget PRIVATE ${PostgreSQL_LIBRARIES})
这是一个如何使用find_package 的简单示例。带有PostgreSQL_ 前缀的变量由find_package 命令运行的脚本设置,并在此处描述:FindPostgreSQL documentation
附带说明,find_library 也可以使用,尽管它是“低级”。该命令搜索静态/共享库,用于实现find_package 使用的脚本。只要您尝试使用的库具有find_package 脚本,就不必使用find_library。
更新(CMake 3.14 及更高版本)
从 CMake 3.14 开始,可以为 Postgres 使用所谓的“导入目标”,这有点简单,符合modern CMake:
find_package(PostgreSQL REQUIRED)
# This line adds both include paths and libraries for Postgres
target_link_libraries(MyTarget PRIVATE PostgreSQL::PostgreSQL)
PostgreSQL::PostgreSQL 是由Find 模块创建的导入目标。此目标包含设置为其INTERFACE 属性的目录和库。这意味着在上面的示例中,MyTarget 将“继承”包括来自PostgreSQL::PostgreSQL 的目录和库,而无需显式设置它们。