如何将 cmake find_package() 与包的本地副本一起使用?

问题描述 投票:0回答:2

我正在尝试创建一个同时包含 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)
但我认为这是一个黑客。 有没有一些直接的方法来构建 zlib 的本地副本,而不需要所有 3 行额外的行?

cmake zlib libpng
2个回答
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
行为)。


0
投票

我处于同样的情况 - 构建一个应用程序,其中 libpng 和 zlib 一起编译到应用程序中,而不是依赖于项目外部全局安装的库。看起来像

find_package(ZLIB)
(由libpng调用)really想要找到已经构建的库,但那些还不存在,而且我不想单独的“构建zlib,现在运行cmake并构建其余的代码”步骤。我的目标是将 zlib 与项目中的任何其他代码段一样对待,以便依赖项和链接都直接通过 cmake 目标处理。我最终得到的东西确实和原始海报一样老套,但它避开了
find_package(ZLIB)
的陷阱,并允许一次性构建所有代码。

# First, add the zlib source.
add_subdirectory(third_party/zlib)

# Next, set ZLIB_INCLUDE_DIR and ZLIB_LIBRARY so that when find_package(ZLIB) is
# called, it is satisfied without actually running most of its search logic.
set(ZLIB_INCLUDE_DIR zlib_nonexistent_include_dir)
set(ZLIB_LIBRARY zlib_nonexistent_library)

# Now add an empty ZLIB::ZLIB interface library to stop find_package(ZLIB) from
# creating one. libpng will still add the target to its list of link libraries,
# but since it's an empty target, it will have no effect.
add_library(ZLIB::ZLIB INTERFACE IMPORTED)

# Set libpng build flags as needed and add the subdirectory.
option(PNG_SHARED "Build libpng as a shared library" OFF)
option(PNG_TESTS "Build the libpng tests" OFF)
option(PNG_TOOLS "Build the libpng tools" OFF)
set(SKIP_INSTALL_ALL TRUE)
add_subdirectory(third_party/libpng)

# Now manually add zlib to libpng's link libraries.
target_link_libraries(png_static PUBLIC zlibstatic)
© www.soinside.com 2019 - 2024. All rights reserved.