首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在cmake项目中构建libgit2

在cmake项目中构建libgit2
EN

Stack Overflow用户
提问于 2018-04-18 06:26:21
回答 1查看 728关注 0票数 0

我有下一个项目树:

代码语言:javascript
复制
>googletest
>libgit2
>src
>tests

主CMakeLists.txt中的代码:

代码语言:javascript
复制
cmake_minimum_required(VERSION 2.8)
project(project_name)
add_subdirectory(src)
add_subdirectory(tests)

src文件夹中的代码CMakeLists.txt:

代码语言:javascript
复制
cmake_minimum_required(VERSION 2.8)
project(project_name)

set(libgit2_src ../libgit2/src)
include_directories(../libgit2 ../libgit2/include)

add_library(gitlib STATIC ${libgit2_src})

add_executable(project_name main.cpp)
target_link_libraries(project_name gitlib)

当我试图生成项目时,我会得到下一个错误:

代码语言:javascript
复制
CMake Error: CMake can not determine linker language for target: gitlib

如何正确地在我的项目中构建和包含库libgit2?

编辑

在主CMakeLists.txt中,我添加了下一个命令:

代码语言:javascript
复制
cmake_minimum_required(VERSION 2.8)

project(project_name)

add_subdirectory(libgit2)
add_subdirectory(src)
add_subdirectory(tests)

之后,我在src文件夹中更改了代码CMakeLists.txt:

代码语言:javascript
复制
cmake_minimum_required(VERSION 2.8)

project(project_name)

pkg_check_modules(LIBGIT2 REQUIRED libgit2)

set(LIBGIT2_LIBS_ABSOLUTE)
foreach(lib ${LIBGIT2_LIBRARIES})
    # Choose name of variable, which will contain result of `find_library`
    # for specific library.
    set(var_name LIBGIT2_${lib}_ABS)
    # Search library under dirs, returned by pkg-config.
    find_library(${var_name} ${lib} ${LIBGIT2_LIBRARY_DIR})
    list(APPEND LIBGIT2_LIBS_ABSOLUTE ${${var_name}})
endforeach()

include_directories(${LIBGIT2_INCLUDE_DIRS})

add_executable(project_name main.cpp)
target_link_libraries(project_name ${LIBGIT2_LIBS_ABSOLUTE}) 

但是,当我配置项目时,我得到的是错误:

代码语言:javascript
复制
CMake Error at D:/Program/CMake/share/cmake-3.10/Modules/FindPkgConfig.cmake:590 (if):
  if given arguments:

    "NOT" "DEFINED" "__pkg_config_checked_LIBGIT2" "OR" "__pkg_config_checked_LIBGIT2" "LESS" "OR" "NOT" "LIBGIT2_FOUND" "OR" "(" "NOT" "libgit2" "STREQUAL" "" "AND" "NOT" "" "STREQUAL" "REQUIRED;libgit2" ")" "OR" "(" "libgit2" "STREQUAL" "" "AND" "NOT" "" "STREQUAL" "REQUIRED" ")"

  Unknown arguments specified
Call Stack (most recent call first):
  src/CMakeLists.txt:5 (pkg_check_modules)

我不明白如何正确地链接和构建这个库到我的项目。

EDIT2我已经分别构建了库libgit2。之后,我更改了主CMakeLists.txt:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.10)

project(project_name)

add_subdirectory(src)
add_subdirectory(tests)

另外,我在src文件夹中更改了CMakeLists.txt:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.10)

project(project_name)

add_executable(project_namemain.cpp)

target_include_directories(project_name PUBLIC ../libgit2/include)
target_link_libraries(project_name ../libgit2/build/Debug/git2)

我得到了正常配置和生成的项目。但是,当我开始构建项目时,我会得到一个错误:

代码语言:javascript
复制
fatal error LNK1104: cannot open file 'libgit2/build/Debug/git2.lib'

如何修复此错误?我尝试过不同的方法来修复这个错误,但是没有成功。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-18 06:33:12

要使CMake正确确定链接器语言,需要向add_library调用中添加至少一个源文件,而不仅仅是源目录。

添加源文件可以通过调用

代码语言:javascript
复制
file(GLOB_RECURSE libgit2_src ../libgit2/src/*.cpp)

代码语言:javascript
复制
set(libgit2_src ../libgit2/src/file1.cpp ../libgit2/src/file2.cpp)

在您的CMakeLists.txt中,后者是首选的(原因见here)。

编辑:我被OPs最初的解决方案误导了。我觉得libgit2是他自己的图书馆。

您应该而不是尝试将libgit2源代码包含到您的项目中。相反,按照以下顺序构建libgit2 (您可能需要调整到OpenSSLZLib库的路径,或者省略该路径)在<libgit2downloaddir>

代码语言:javascript
复制
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/install/prefix -DZLIB_LIBRARY=/installed/zlib -DOPENSSL_SSL_LIBRARY=/install/libssl.a -DOPENSSL_CRYPRO_LIBRARY=installed/libcrypto.a
make install

由于libgit2没有在您的项目中提供包配置模块(git2-config.cmake或git2Config.cmake),所以您需要执行

代码语言:javascript
复制
target_include_directories(younameit <pathtoinstalledlibgit2includes>)
target_link_library(younameit <fullpathto>/libgit2.a)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49892597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档