在 cmake 项目中构建 libgit2
Build libgit2 in cmake project
我有下一个项目树:
>googletest
>libgit2
>src
>tests
main中的代码CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(project_name)
add_subdirectory(src)
add_subdirectory(tests)
src文件夹中的代码CMakeLists.txt:
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)
当我尝试生成项目时,出现下一个错误:
CMake Error: CMake can not determine linker language for target: gitlib
如何在我的项目中正确构建和包含库 libgit2?
编辑
在主要 CMakeLists.txt 我添加了下一个命令:
cmake_minimum_required(VERSION 2.8)
project(project_name)
add_subdirectory(libgit2)
add_subdirectory(src)
add_subdirectory(tests)
之后,我更改了 src 文件夹中的代码 CMakeLists.txt:
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})
但是当我配置项目时,出现错误:
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)
我不明白如何正确地 link 并将这个库构建到我的项目中。
EDIT2
我已经单独构建了库 libgit2。
之后,我改变了主要 CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(project_name)
add_subdirectory(src)
add_subdirectory(tests)
此外,我在 src 文件夹中更改了 CMakeLists.txt:
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)
我正在获取正常配置和生成的项目。
但是当我开始构建项目时出现错误:
fatal error LNK1104: cannot open file 'libgit2/build/Debug/git2.lib'
如何解决这个错误?我尝试了不同的方法来修复这个错误,但没有成功。
要使 CMake 正确确定链接器语言,您需要至少向 add_library
调用添加一个源文件,而不仅仅是源目录。
添加源文件可以通过调用
来完成
file(GLOB_RECURSE libgit2_src ../libgit2/src/*.cpp)
或
set(libgit2_src ../libgit2/src/file1.cpp ../libgit2/src/file2.cpp)
在你的CMakeLists.txt中,而后者是首选(原因见here)。
编辑:我有点被 OP 的初始解决方案误导了。我的印象是 libgit2
是他自己的图书馆。
您应该不尝试将 libgit2
源包含到您的项目中。
而是按以下顺序构建 libgit2
(您可能需要调整 OpenSSL
和 ZLib
库的路径或忽略它)在 <libgit2downloaddir>
:
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)你需要做一个
target_include_directories(younameit <pathtoinstalledlibgit2includes>)
target_link_library(younameit <fullpathto>/libgit2.a)
我有下一个项目树:
>googletest
>libgit2
>src
>tests
main中的代码CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(project_name)
add_subdirectory(src)
add_subdirectory(tests)
src文件夹中的代码CMakeLists.txt:
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)
当我尝试生成项目时,出现下一个错误:
CMake Error: CMake can not determine linker language for target: gitlib
如何在我的项目中正确构建和包含库 libgit2?
编辑
在主要 CMakeLists.txt 我添加了下一个命令:
cmake_minimum_required(VERSION 2.8)
project(project_name)
add_subdirectory(libgit2)
add_subdirectory(src)
add_subdirectory(tests)
之后,我更改了 src 文件夹中的代码 CMakeLists.txt:
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})
但是当我配置项目时,出现错误:
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)
我不明白如何正确地 link 并将这个库构建到我的项目中。
EDIT2 我已经单独构建了库 libgit2。 之后,我改变了主要 CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(project_name)
add_subdirectory(src)
add_subdirectory(tests)
此外,我在 src 文件夹中更改了 CMakeLists.txt:
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)
我正在获取正常配置和生成的项目。 但是当我开始构建项目时出现错误:
fatal error LNK1104: cannot open file 'libgit2/build/Debug/git2.lib'
如何解决这个错误?我尝试了不同的方法来修复这个错误,但没有成功。
要使 CMake 正确确定链接器语言,您需要至少向 add_library
调用添加一个源文件,而不仅仅是源目录。
添加源文件可以通过调用
来完成file(GLOB_RECURSE libgit2_src ../libgit2/src/*.cpp)
或
set(libgit2_src ../libgit2/src/file1.cpp ../libgit2/src/file2.cpp)
在你的CMakeLists.txt中,而后者是首选(原因见here)。
编辑:我有点被 OP 的初始解决方案误导了。我的印象是 libgit2
是他自己的图书馆。
您应该不尝试将 libgit2
源包含到您的项目中。
而是按以下顺序构建 libgit2
(您可能需要调整 OpenSSL
和 ZLib
库的路径或忽略它)在 <libgit2downloaddir>
:
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)你需要做一个
target_include_directories(younameit <pathtoinstalledlibgit2includes>)
target_link_library(younameit <fullpathto>/libgit2.a)