visual-studio-2010 – CMake:发现错误的zlib – 如何从src(使用主项目CMakeLists.txt)构建zlib并链接它?

//简要版

如何使CMake使用我提供的zlib(它也必须从源代码构建)而不是查找器找到的zlib而不破坏其他库(OpenGL)的查找程序?

ZLib需要由主项目和libPNG使用,它也是源代码.

主要目标平台是Windows.

//更长的版本:

在我的项目中,我需要链接libpng,zlib和OpenGL. libpng依赖于zlib.但是zlib也是主项目所必需的.

我需要为除OpenGL之外的所有库提供源代码,并与之一起构建这些库
断言链接正确版本和简化Windows构建的主要项目.

我找到了使用自定义库来完成所有这些操作的方法,其中没有内置的查找器,但是我不能仅仅为zlib正确覆盖finder.如果我更改了libs的搜索路径,则找不到OpenGL.

但是我无法让cmake使用我提供的zlib而不是包查找器在我的系统中找到的rouge zlib.DLL. (来自龟龟的那个)

我试图将ZLIB_LIBRARY设置为特定的文件路径,但这只适用于MinGW,我也认为这不是这样做的方法.

(而且由于一个莫名其妙的原因,我还必须明确链接到png16_static而不仅仅是libpng.)

对此有任何帮助非常感谢.也许我是以错误的方式接受这个?

目标与开发平台:

Windows7
Visual Studio 2010
and MinGW (both need to work)

我的(简化示例)CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)

project (MyProject)

  find_package(OpenGL)

  add_executable(MyProject main.cpp)

  include_directories(${INCLUDE_DIRECTORIES} "${PROJECT_BINARY_DIR}")

  include_directories(${INCLUDE_DIRECTORIES} "external_libs/lpng162")

  include_directories(${INCLUDE_DIRECTORIES} "external_libs/zlib-1.2.8")

  include_directories(${INCLUDE_DIRECTORIES} "${PROJECT_BINARY_DIR}/external_libs/zlib-1.2.8")

  add_subdirectory("external_libs/zlib-1.2.8")
  link_directories(${LINK_DIRECTORIES} "${PROJECT_BINARY_DIR}/external_libs/zlib-1.2.8")

  # libpng will not build correctly if this not set
  set (ZLIB_ROOT "${PROJECT_SOURCE_DIR}/external_libs/zlib-1.2.8")

  # manually set this to prevent cmake from finding the tortiose-git zlib.dll first
  # DOES NOT WORK CORRECTLY, only with mingw32
  set (ZLIB_LIBRARY "${PROJECT_BINARY_DIR}/external_libs/zlib-1.2.8/libzlib.dll")

  add_subdirectory("external_libs/lpng162")

  TARGET_LINK_LIBRARIES(MyProject png16_static zlib ${OPENGL_LIBRARY})

项目(简化示例)结构:

./main.cpp
./CMakeLists.txt
./external_libs/zlib-1.2.8/ <- contains respective source
./external_libs/lpng162/    <- contains respective source

最佳答案 第三方库很可能会调用
FindZLIB.cmake来确定CMake的位置.通过手动设置ZLIB_LIBRARY已经有了正确的想法,但是并没有完全正确:

add_subdirectory(<path_to_zlib_src_dir>)

set(ZLIB_INCLUDE_DIR  "<path_to_zlib_src_dir>" "${CMAKE_BINARY_DIR}/<path_to_zlib_build_dir>")
set(ZLIB_LIBRARY zlib)

add_subdirectory(<path_to_lpng_src_dir>)    

> include目录需要包含src和构建路径,因为zconf.h是由CMake构建的
>库名称只是CMake目标名称,而不是结果文件的完整路径.
>在Windows上,CMake不会自动复制dll.您可能需要添加一些额外的代码以确保zlib和lpng dll最终位于正确的位置.
>您可以自己调用find_package(zlib)以确保其行为符合预期
>在极少数情况下,第三方lib不使用查找脚本,您将不得不深入了解该项目的CMakeLists以了解发生了什么

点赞