如何在 Windows 上使用嵌入式 libssh2 构建 libgit2
How to build libgit2 with embedded libssh2 on Windows
首先我们使用 WinCNG
后端构建 libssh2
msvc
:
cmake . -DCRYPTO_BACKEND=WinCNG -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=%LIBSSH2%
cmake --build . --target install
libgit2
文档说我们所要做的就是设置 DEMBED_SSH_PATH
,尽管它没有说明将其设置为什么。也许它是如此明显以至于看起来无关紧要。但是:我不是 C
人,对 cmake 构建过程一无所知。据我了解,先前构建的结果所在的文件夹及其所有子文件夹(例如 include
和 bin
应该是正确的路径,因此使用 %LIBSSH2%
应该没问题。
最终尝试构建时 libgit2
运行
cmake . -DBUILD_CLAR=OFF -DCMAKE_BUILD_TYPE=Release -DEMBED_SSH_PATH=%LIBSSH2% -DCMAKE_INSTALL_PREFIX="%LIBGIT2%"
cmake --build . --target install
它会失败,因为它找不到头文件/二进制文件的链接。我们看到的是:
error LNK2019: unresolved external symbol libssh2_init referenced in function
我已经尝试用普通斜杠 /
替换路径反斜杠 \
,因为这似乎是一个常见问题。我也试过明确设置
set CMAKE_INCLUDE_PATH=%LIBSSH2%/include
set CMAKE_LIBRARY_PATH=%LIBSSH2%/lib
两者都失败了,结果相同。
任何人都可以提供一种可重现的方法来编译带有嵌入式 libssh2
的 libgit2
吗?
使用 EMBED_SSH_PATH
意味着 libssh2 源代码将与 libgit2s 同时编译。这意味着您实际上根本不需要编译 libssh2。
我通过下载 libssh2 和 libgit2 的源代码成功编译,然后 运行 以下命令:
cd libgit2
mkdir build
cd build
cmake .. -DBUILD_CLAR=OFF -DCMAKE_BUILD_TYPE=Release -DEMBED_SSH_PATH="C:/path-to-ssh/libssh2" -DCMAKE_INSTALL_PREFIX="%LIBGIT2%"
cmake --build . --target install
在内部,如果设置了 EMBED_SSH_PATH
,它会查找所有匹配 ${EMBED_SSH_PATH}/src/*.c
的文件。
至于使用WinCNG
作为后端,使用嵌入式SSH在libssh2目录中创建这个文件(libssh2_config.h
):
#define HAVE_WINCNG
#define LIBSSH2_WINCNG
#include "../win32/libssh2_config.h"
我认为这意味着它已经是嵌入式安装的默认后端。
首先我们使用 WinCNG
后端构建 libssh2
msvc
:
cmake . -DCRYPTO_BACKEND=WinCNG -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=%LIBSSH2%
cmake --build . --target install
libgit2
文档说我们所要做的就是设置 DEMBED_SSH_PATH
,尽管它没有说明将其设置为什么。也许它是如此明显以至于看起来无关紧要。但是:我不是 C
人,对 cmake 构建过程一无所知。据我了解,先前构建的结果所在的文件夹及其所有子文件夹(例如 include
和 bin
应该是正确的路径,因此使用 %LIBSSH2%
应该没问题。
最终尝试构建时 libgit2
运行
cmake . -DBUILD_CLAR=OFF -DCMAKE_BUILD_TYPE=Release -DEMBED_SSH_PATH=%LIBSSH2% -DCMAKE_INSTALL_PREFIX="%LIBGIT2%"
cmake --build . --target install
它会失败,因为它找不到头文件/二进制文件的链接。我们看到的是:
error LNK2019: unresolved external symbol libssh2_init referenced in function
我已经尝试用普通斜杠 /
替换路径反斜杠 \
,因为这似乎是一个常见问题。我也试过明确设置
set CMAKE_INCLUDE_PATH=%LIBSSH2%/include
set CMAKE_LIBRARY_PATH=%LIBSSH2%/lib
两者都失败了,结果相同。
任何人都可以提供一种可重现的方法来编译带有嵌入式 libssh2
的 libgit2
吗?
使用 EMBED_SSH_PATH
意味着 libssh2 源代码将与 libgit2s 同时编译。这意味着您实际上根本不需要编译 libssh2。
我通过下载 libssh2 和 libgit2 的源代码成功编译,然后 运行 以下命令:
cd libgit2
mkdir build
cd build
cmake .. -DBUILD_CLAR=OFF -DCMAKE_BUILD_TYPE=Release -DEMBED_SSH_PATH="C:/path-to-ssh/libssh2" -DCMAKE_INSTALL_PREFIX="%LIBGIT2%"
cmake --build . --target install
在内部,如果设置了 EMBED_SSH_PATH
,它会查找所有匹配 ${EMBED_SSH_PATH}/src/*.c
的文件。
至于使用WinCNG
作为后端,使用嵌入式SSH在libssh2目录中创建这个文件(libssh2_config.h
):
#define HAVE_WINCNG
#define LIBSSH2_WINCNG
#include "../win32/libssh2_config.h"
我认为这意味着它已经是嵌入式安装的默认后端。