如何使用cmake的find_package()函数来使用本地包的副本?

8
我正在尝试制作一个同时包含ZLIB和LIBPNG(以及其他库)的项目。LibPNG的CMakeLists.txt文件中有以下代码:find_package(ZLIB REQUIRED) 这是它所带的默认代码,我不想更改它。
我正在Windows上进行构建(使用Visual Studio)。这是一个跨平台应用程序(Windows、Mac、Linux和移动设备),我不能依赖于任何库的/usr/lib版本。因此,我将所有库与我的项目一起构建。
除非我对其进行修改,否则无法构建LibPNG。在一个上层的CMakeLists.txt文件中,我加入了以下内容:
ADD_SUBDIRECTORY(contrib/${CUSTOM_ZLIB_LOCATION})
SET(ZLIB_FOUND ON CACHE BOOL "Yes")
SET(ZLIB_INCLUDE_DIR ${CMAKE_BINARY_DIR}/contrib/${CUSTOM_ZLIB_LOCATION} {CMAKE_SOURCE_DIR}/contrib/${CUSTOM_ZLIB_LOCATION})
SET(ZLIB_LIBRARY zlib CACHE STRING "zlib library name")

这满足了find_package(ZLIB REQUIRED),但我认为这是一种hack。是否有一种直接的方法来构建本地zlib副本而不需要额外的3行代码?

是的。对我没用。也许我做错了? - 101010
我在我的一个项目中使用与你相同的方法来构建zlib/libpng,目前没有任何问题。两个小问题:你应该将ZLIB_INCLUDE_DIRset转换为set(... CACHE STRING "")。此外,手动设置ZLIB_FOUND是不必要的。只要在缓存中设置了ZLIB_INCLUDE_DIRZLIB_LIBRARY,查找脚本就应该按预期工作。考虑静态链接这两个库以最小化与系统库的潜在冲突。 - ComicSansMS
1个回答

9

我只在开头添加了这一行(至少在find_package(ZLIB REQUIRED)之前),它对我有效。

set(ZLIB_ROOT <zlib folder here>)

但其他人可能需要做类似以下的事情:

if (CMAKE_VERSION VERSION_GREATER 3.12 OR CMAKE_VERSION VERSION_EQUAL 3.12)
  # Enable find_package uses of <PackageName>_ROOT variables.
  cmake_policy(SET CMP0074 NEW)
endif()

set(ZLIB_ROOT <zlib folder here>)

我们将策略设置为NEW
该策略的OLD行为是忽略<PackageName>_ROOT变量。
CMake 3.22.1版本在未设置策略时发出警告(并默认采用OLD行为)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接