2013-07-17 40 views
4

//簡略版CMake:發現了錯誤的zlib - 如何從src構建zlib(使用主項目CMakeLists.txt)並鏈接它?

如何使CMake的使用我提供的zlib的(它也有從源頭上建立),而不是一個沒有打破發現者其他庫通過取景器中( OpenGL)?

的ZLib需要由主體工程使用,也可以的libpng這是作爲來源。

主要目標平臺是Windows。

//更長的版本:

在我的項目,我需要對的libpngzlib的的OpenGL鏈接。用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 

回答

2

第三-pa rty庫很可能會調用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上dll不會被CMake自動複製。您可能需要添加一些額外的代碼,以確保zlib和lpng dll最終放置在正確的位置。
  • 您可以自己打電話find_package(zlib)以確保其行爲與預期
  • 在極少數情況下,一個第三方的lib不使用查找腳本,你必須深入到該項目的CMakeLists找出到底是怎麼回事上
+0

謝謝,幫助!在包含libpng之前,我必須添加「set(SKIP_INSTALL_ALL ON)」,但這不是問題,因爲我不想以任何方式安裝它。 – Rock