1

我有一个项目,我在其中编写了一个使用exiv2库的库。exiv2本身需要zlib。如果我不zlib作为外部项目导入,我会通过安装包zlib1g-dev(在 Ubuntu 上)让它工作,因为那样find_package( ZLIB REQUIRED )fromexiv2会找到它。

由于交叉编译的原因,我不能使用来自zlib1g-dev. 这就是为什么我想将zlib源添加为外部项目和exiv2(也是外部项目)的依赖项。这是我走了多远:

CMakeLists.txt我的图书馆:

# Download and unpack zlib at configure time
configure_file(CMakeLists.in.zlib zlib-download/CMakeLists.txt)
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/zlib-download"
)
execute_process(COMMAND "${CMAKE_COMMAND}" --build .
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/zlib-download"
)
# Add zlib to the build
add_subdirectory("${CMAKE_CURRENT_BINARY_DIR}/zlib-src"
                 "${CMAKE_CURRENT_BINARY_DIR}/zlib-build"
)


# Download and unpack exiv2 at configure time
configure_file(CMakeLists.in.exiv2 exiv2-download/CMakeLists.txt)
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/exiv2-download"
)
execute_process(COMMAND "${CMAKE_COMMAND}" --build .
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/exiv2-download"
)
# Override options of exiv2
set(EXIV2_BUILD_SAMPLES OFF CACHE BOOL "" FORCE)
set(EXIV2_BUILD_EXIV2_COMMAND OFF CACHE BOOL "" FORCE)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(EXIV2_ENABLE_DYNAMIC_RUNTIME OFF CACHE BOOL "" FORCE)
# Add exiv2 to the build
add_subdirectory("${CMAKE_CURRENT_BINARY_DIR}/exiv2-src"
                 "${CMAKE_CURRENT_BINARY_DIR}/exiv2-build"
)

add_library(mylibrary mylibrary.cpp)
target_link_libraries(mylibrary exiv2lib)

在哪里CMakeLists.in.zlib

cmake_minimum_required(VERSION 2.8.2)

project(zlib-download NONE)

include(ExternalProject)
ExternalProject_Add(zlib
  GIT_REPOSITORY    https://github.com/madler/zlib.git
  GIT_TAG           master
  SOURCE_DIR        "${CMAKE_CURRENT_BINARY_DIR}/zlib-src"
  BINARY_DIR        "${CMAKE_CURRENT_BINARY_DIR}/zlib-build"
  CONFIGURE_COMMAND ""
  BUILD_COMMAND     ""
  INSTALL_COMMAND   ""
  TEST_COMMAND      ""
)

并且CMakeLists.in.exiv2

cmake_minimum_required(VERSION 2.8.2)

project(exiv2-download NONE)

include(ExternalProject)
ExternalProject_Add(exiv2
  GIT_REPOSITORY    https://github.com/Exiv2/exiv2.git
  GIT_TAG           master
  SOURCE_DIR        "${CMAKE_CURRENT_BINARY_DIR}/exiv2-src"
  BINARY_DIR        "${CMAKE_CURRENT_BINARY_DIR}/exiv2-build"
  CONFIGURE_COMMAND ""
  BUILD_COMMAND     ""
  INSTALL_COMMAND   ""
  TEST_COMMAND      ""
)

但是使用这些 CMake 文件会返回错误:

CMake Error at /usr/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
Call Stack (most recent call first):
  /usr/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-3.10/Modules/FindZLIB.cmake:112 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  /tmp/QtCreator-wQKSzo/qtc-cmake-XXbL8ZLF/mylibrary/exiv2-src/cmake/findDependencies.cmake:24 (find_package)
  /tmp/QtCreator-wQKSzo/qtc-cmake-XXbL8ZLF/mylibrary/exiv2-src/CMakeLists.txt:62 (include)

那么,我怎样才能zlib提供给exiv2?

4

0 回答 0