2013-07-17 2 views
4

// краткая версияCMake: неправильный zlib найден - как построить zlib из src (с основным проектом CMakeLists.txt) и связать его?

Как я могу сделать CMake использовать мой поставляемый Zlib (который также должен строить из источника) вместо найденного искателем, не нарушая искатель для другой LIBS (OpenGL)?

ZLib должен быть использован основной проект, а также Libpng который поставляется в качестве источника, а также.

Первичная целевая платформа - Windows.

// длинная версия:

В моем проекте мне нужно связать против Libpng, ZLIB и OpenGL. С libpng зависит от zlib. Но zlib также требуется по основному проекту.

мне нужно предоставить исходный код для всех LIBS кроме OpenGL, и построить эти библиотеки вместе с главным проектом утверждать, связывающие правильную версию и упростить строительство на Windows.

Я нашел способы сделать все это с помощью пользовательских библиотек, где нет встроенного искателя, но я не могу переопределить искатель правильно только для zlib. Если я изменил путь поиска для libs, то OpenGL не будет найден.

Однако я не могу получить cmake, чтобы использовать предоставленные мной zlib вместо rouge zlib.DLL, что искатель пакетов находит где-то в моей системе. (The one from tortoise git)

Я попытался установить ZLIB_LIBRARY на определенный путь к файлу, но это работает только на MinGW, и я также думаю, что это не способ сделать это.

(А также я должен был явно ссылку на png16_static вместо того, чтобы просто Libpng, по необъяснимой причине.)

Любая помощь по этому вопросу очень ценится. Может, я ошибаюсь?


Target & Платформа разработки:

Windows7 
Visual Studio 2010 
and MinGW (both need to work) 

My (упрощенный пример) 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. Возможно, вы захотите добавить дополнительный код, чтобы убедиться, что dll zlib и lpng попадают в нужное место.
  • Вы можете позвонить find_package(zlib) себя, чтобы убедиться, что ведет себя, как и ожидалось
  • В редких случаях, когда третья сторона Lib не использует скрипт найти, вам придется копаться в CMakeLists этого проекта, чтобы выяснить, что происходит на
+0

Спасибо, что помогли! Я должен был добавить «set (SKIP_INSTALL_ALL ON)», прежде чем включать libpng, но это не проблема, так как я не хочу устанавливать его таким образом. – Rock

Смежные вопросы