//简要版
如何让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
答案 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>)
find_package(zlib)
以确保其行为符合预期