CMake:找到了错误的zlib - 如何从src(使用主项目CMakeLists.txt)构建zlib并链接它?

时间:2013-07-17 11:07:03

标签: visual-studio-2010 cmake mingw

//简要版

如何让CMake使用我提供的 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

1 个答案:

答案 0 :(得分:2)

第三方图书馆最有可能致电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以了解正在发生的事情