Невозможность использования XercesC в проекте CMAKE

Я пытаюсь создать проект CMAKE, который ссылается на xerces-c в Windows. Xerces-C был собран с помощью cmake и установлен в папку. Вот схема установки:

xercesc/3.2.2
  |
  |-bin
  |  |-xerces-cXERCES_ROOT2.dll
  |  |-xerces-cXERCES_ROOT2D.dll
  |  |-(many executables)
  |
  |-cmake
  |  |-XercesCConfig.cmake
  |  |-XercesCConfigInterna.cmale
  |  |-(other .cmake)
  |
  |-include
  |  |-xercesc
  |     |-dom
  |     |-framework
  |     |-internal
  |     |-parsers
  |     |-util
  |     |-(other folders)
  |
  |-lib
  |  |-xerces-c_3.lib
  |  |-xerces-c_3D.lib
  |
  |-share
     |-doc
        |-(documentation

Это мой CMakeFile.txt

cmake_minimum_required (VERSION 3.10.0)

project (myproject)

set (CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} ${XERCES_ROOT})
message (STATUS "CMAKE_INCLUDE_PATH is ${CMAKE_INCLUDE_PATH}")
find_package (XercesC REQUIRED)

set (CMAKE_INCLUDE_CURRENT_DIR ON)
include_directories (${CMAKE_CURRENT_SOURCE_DIR}/..)
include_directories (${XercesC_INCLUDE_DIR})

set (PROJECT_SRC
  Dummy.cpp
  )

add_library (${PROJECT_NAME} SHARED ${PROJECT_SRC})

XERCES_ROOT — это переменная, определенная в моем мастере CMakeLists.txt.

set (XERCES_ROOT "" CACHE FILEPATH "Root directory of the Xerces-C installation")

Я выполняю cmake с помощью следующей команды:

 cmake -DBOOST_ROOT=D:\lib\Boost\1.69.0\ -DXERCES_ROOT=d:\lib\xercesc\3.2.2\ -G "Visual Studio 15 2017 Win64" ../

Когда я запускаю cmake, я печатаю содержимое CMAKE_INCLUDE_PATH:

-- CMAKE_INCLUDE_PATH is D:/lib/xercesc/3.2.2

Это правильное место. Я установил эту переменную прямо перед строкой find_package(XercesC REQUIRED).

Но пакет не найден. Это сообщение об ошибке:

CMake Error at C:/Program Files/CMake/share/cmake-3.13/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Failed to find XercesC (missing: XercesC_LIBRARY XercesC_INCLUDE_DIR
  XercesC_VERSION)
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.13/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
  C:/Program Files/CMake/share/cmake-3.13/Modules/FindXercesC.cmake:98 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  src/myproject/CMakeLists.txt:7 (find_package)


-- Configuring incomplete, errors occurred!

Что я делаю неправильно? Что я могу сделать, чтобы сообщить CMAKE, где найти Xerces? Может быть, использование CMAKE_INCLUDE_PATH неправильно?


person Jepessen    schedule 28.01.2019    source источник
comment
Что это говорит о библиотеке XercesC_LIBRARY? (также известный как, вы уверены, что выбрали одну и ту же цель, 32 или 64 бита, ни для чего?)   -  person Matthieu Brucher    schedule 28.01.2019
comment
Что ты конкретно имеешь ввиду? В сообщении об ошибке написано, что отсутствует. И я выбрал правильную цель (64 бита)   -  person Jepessen    schedule 28.01.2019
comment
Почему он отсутствует, если он явно есть? Что говорит журнал ошибок (CMakeFiles/CMakeError.log)   -  person Matthieu Brucher    schedule 28.01.2019
comment
CMakeFiles\CMakeError.log не создается. CMakeFiles\CMakeOutput.log пусто.   -  person Jepessen    schedule 28.01.2019
comment
Это странно. Ни одно из них не должно быть пустым. Вы уверены, что смотрели в правильном месте? Есть ошибка, поэтому она должна быть в журнале ошибок (никогда не видел, чтобы этого не происходило).   -  person Matthieu Brucher    schedule 28.01.2019
comment
@MatthieuBrucher: Данная ошибка выдается командой message(FATAL_ERROR), почему вы думаете, что CMakeError.log или CMakeOutput.log должны содержать запись об этой ошибке?   -  person Tsyvarev    schedule 28.01.2019
comment
@Tsyvarev Потому что сначала не удалось найти библиотеки XercesC. Это должно быть в журнале ошибок, так же как и поиск пути включения. FATAL возникает из-за процесса проверки после этого шага. Так что FATAL не первая ошибка.   -  person Matthieu Brucher    schedule 28.01.2019
comment
@MatthieuBrucher: я никогда не видел регистрации вызовов find_path или find_library, даже если они не удались.   -  person Tsyvarev    schedule 28.01.2019
comment
Я только что очистил каталог сборки и снова выполнил всю сборку. Это то же самое. Журнал CMakeErrors.log не создан. CMakeOutput.log слишком длинный для размещения здесь, но он не содержит ошибок. просто куча настроек проекта Visual Studio. Полный вывод находится здесь pastebin.com/4m4p5hEW   -  person Jepessen    schedule 28.01.2019
comment
Хорошо, а в общем журнале ничего странного об этой пропавшей библиотеке нет?   -  person Matthieu Brucher    schedule 28.01.2019
comment
Как правило, в проектах CMake INCLUDE_PATH не является корневым и обычно заканчивается на /include. В вашем случае путь включения должен быть D:/lib/xercesc/3.2.2/include. Для поиска библиотеки нужно указать переменную CMAKE_LIBRARY_PATH. В качестве альтернативы вы можете указать (добавить) переменную CMAKE_PREFIX_PATH: эта переменная влияет как на поиск библиотеки, так и на поиск заголовков, и она содержит именно ROOT'ы пакетов.   -  person Tsyvarev    schedule 28.01.2019
comment
@Цыварев Спасибо! Использование CMAKE_PREFIX_PATH решило мою проблему. Можете ли вы написать ответ, чтобы я мог принять его? Спасибо всем за помощь.   -  person Jepessen    schedule 28.01.2019


Ответы (1)


Для подсказки CMake о корне внешних пакетов, используемых в вашем проекте, можно указать этот корень в переменной CMAKE_PREFIX_PATH:

cmake -DCMAKE_PREFIX_PATH=d:\lib\xercesc\3.2.2\ <other-options>

Таким образом, вашему CMakeLists.txt вообще не нужно беспокоиться об этих подсказках: он просто использует find_package() и ожидает, что все будет работать.

См. также что мой ответ о других способах использования переменной CMAKE_PREFIX_PATH и других возможностей этой переменной.

person Tsyvarev    schedule 28.01.2019