//简要版
如何使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以了解发生了什么