我正在尝试创建一个同时包含 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 行额外的行?
我只在开始时添加了这一行(至少在
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
我处于同样的情况 - 构建一个应用程序,其中 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)