6

// 简要版本

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

ZLib需要被主项目使用,libPNG也是源代码。

主要目标平台是 Windows。

// 更长的版本:

在我的项目中,我需要链接libpngzlibOpenGL。libpng依赖zlib。但是主项目也需要zlib 。

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

我找到了使用不存在内置查找器的自定义库来完成所有这些操作的方法,但我无法仅针对 zlib 正确覆盖查找器。如果我更改库的搜索路径,则找不到 OpenGL。

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

我试图将 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
4

1 回答 1

5

第三方库很可能调用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>)    
  • 包含目录需要同时包含 src 和构建路径,因为 zconf.h 是由 CMake 构建的
  • 库名称只是 CMake 目标名称,而不是生成文件的完整路径。
  • 在 Windows 上,CMake 不会自动复制 dll。您可能需要添加一些额外的代码以确保 zlib 和 lpng dll 最终位于正确的位置。
  • 你可以打电话find_package(zlib)自己以确保它按预期运行
  • 在第三方库不使用 find 脚本的极少数情况下,您将不得不深入研究该项目的 CMakeLists 以了解发生了什么
于 2013-07-18T08:30:02.333 回答