Не удалось найти libgit2 в CMake - PullRequest
1 голос
/ 10 июля 2020

Я делаю свои первые шаги в CMake, и у меня есть пример Hello World, где я хотел бы использовать libgit2 . Моя структура каталогов следующая:

- main.cpp
- CMakeLists.txt
- cmake/Modules/Findlibgit2.cmake
- libs/libgit2/include/git2.h
- libs/libgit2/debug/git/git2.lib
- libs/libgit2/debug/git/git2.dll

Я хотел бы связать его статически или динамически, по крайней мере, для начала это работает. Но когда я запускаю CMake, я получаю сообщение об ошибке ниже. Может ли кто-нибудь помочь мне с этим?

Not searching for unused variables given on the command line.
[cmake] CMake Error at C:/Program Files/CMake/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:164 (message):
[cmake]   Could NOT find libgit2 (missing: GIT2_LIBRARY GIT2_INCLUDE_PATH)
[cmake] Call Stack (most recent call first):
[cmake]   C:/Program Files/CMake/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:445 (_FPHSA_FAILURE_MESSAGE)
[cmake]   cmake/Modules/Findlibgit2.cmake:15 (find_package_handle_standard_args)
[cmake]   CMakeLists.txt:6 (find_package)

Findlibgit2.cmake

# Find git2 Library
#
#  GIT2_INCLUDE_DIRS - where to find git2.h, etc.
#  GIT2_LIBRARIES    - List of libraries when using libgit2.
#  GIT2_FOUND        - True if libgit2 is found.

# GIT2_INCLUDE_PATH
find_path(GIT2_INCLUDE_PATH NAMES git2.h)
# GIT2_LIBRARY
find_library(GIT2_LIBRARY NAMES git2)

# handle the QUIETLY and REQUIRED arguments and set GIT2_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(libgit2 REQUIRED_VARS GIT2_LIBRARY GIT2_INCLUDE_PATH)


if (GIT2_FOUND)
  set(GIT2_INCLUDE_DIR  ${GIT2_INCLUDE_PATH})
  set(GIT2_INCLUDE_DIRS ${GIT2_INCLUDE_PATH})
  set(GIT2_LIBRARIES    ${GIT2_LIBRARY})
endif()

mark_as_advanced(
  GIT2_INCLUDE_PATH
  GIT2_LIBRARY
)

CMakeLists.txt


cmake_minimum_required(VERSION 2.8.9)
project (backend)

SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")
find_package(libgit2 REQUIRED)

include_directories(${LIBGIT2_INCLUDE_DIR})
link_directories("backend/libs/libgit2/debug")
add_executable(backend main.cpp)

1 Ответ

1 голос
/ 17 июля 2020

Кажется, что libgit2 не предоставляет файл конфигурации пакета CMake , поэтому вам нужно написать модуль поиска или найти его в inte rnet. Имеющийся у вас файл Findlibgit2.cmake - хорошее начало.

Я нашел здесь еще один модуль поиска libgit2: Findlibgit2.cmake . Этот использует pkg-config , используя файл .p c, предоставленный самой libgit2, но, учитывая, что вы используете Windows, вам потребуется установить pkg-config вручную . Это может быть больше проблем, чем оно того стоит.

Относительно вашего сообщения об ошибке:

Если пакет libgit2 не находится в стандартном системном пути, CMake не будет знать, где искать для этого. Итак, вы должны явно указать CMake, где искать. Один простой способ сделать это - изменить файл Findlibgit2.cmake, используя HINTS для команд find_*:

# GIT2_INCLUDE_PATH
find_path(GIT2_INCLUDE_PATH NAMES git2.h
    HINTS ${GIT2_INCLUDEDIR}
)
# GIT2_LIBRARY
find_library(GIT2_LIBRARY NAMES git2
    HINTS ${GIT2_LIBRARYDIR}
)

Теперь мы можем заполнить эти переменные GIT2_INCLUDEDIR и GIT2_LIBRARYDIR, чтобы укажите на установленный пакет libgit2. После этого find_package() должен успешно найти компоненты пакета, и вы можете создать ссылку на git2.lib, используя ${GIT2_LIBRARIES}.

CMakeLists.txt:

<code>cmake_minimum_required(VERSION 2.8.9)
project (backend)

SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")

# Set hints so CMake knows where libgit2 is located on your machine.
set(GIT2_INCLUDEDIR ${CMAKE_CURRENT_LIST_DIR}/libs/libgit2/include)
set(GIT2_LIBRARYDIR ${CMAKE_CURRENT_LIST_DIR}/libs/libgit2/debug/git)
find_package(libgit2 REQUIRED)

include_directories(${GIT2_INCLUDE_DIR})

# Don't need this line. Use of 'link_directories' is <b>discouraged</b>.
<s>link_directories("backend/libs/libgit2/debug")</s>

add_executable(backend main.cpp)
# Add this line to link against the libgit2 libraries.
target_link_libraries(backend PRIVATE ${GIT2_LIBRARIES})

Более переносимый способ установить эти HINTS переменные - вместо этого установить их при вызове cmake в командной строке:

cmake -DGIT2_INCLUDEDIR=C:/path/to/libgit2/include -DGIT2_LIBRARYDIR=D:/path/to/libgit2/lib ..

Таким образом, если у вас есть другие разработчики, работающие с проектом, они могут указывать на то место, где у них может быть установлена ​​libgit2 на их компьютере, что устраняет необходимость изменять файл CMakeLists.txt.

...