# 编译 libssh2

## 步骤

1. **安装必要的软件**\
   确保你已经安装了以下软件：
   * [CMake](https://cmake.org/download/)
   * [Visual Studio 2022](https://visualstudio.microsoft.com/)（包括C++开发工具）
2. **下载libssh2源代码**\
   你可以从libssh2的官方GitHub仓库下载源代码：

```
git clone https://github.com/libssh2/libssh2.git
cd libssh2
```

1. **配置和编译libssh2**\
   使用CMake配置和生成Visual Studio项目文件，然后使用Visual Studio编译库：

```
mkdir build
cd build
cmake -G "Visual Studio 17 2022" -A x64 -DBUILD_SHARED_LIBS=ON ..
```

1. **使用Visual Studio编译库**\
   打开生成的Visual Studio解决方案文件（`libssh2.sln`），选择Release配置，并编译解决方案。这将生成所需的libssh2.dll和libssh2.lib文件。
2. **将生成的文件复制到项目中**\
   编译完成后，libssh2.dll和libssh2.lib文件将位于`build/src/Release/`目录中。将这些文件复制到你的项目目录中，例如：

```
MySSHProject/
├── libssh2/
│   ├── include/
│   │   └── libssh2.h
│   ├── libssh2.lib
│   └── libssh2.dll
├── CMakeLists.txt
├── main.cpp
├── sshclient.cpp
├── sshclient.h
└── main.qml
```

#### 更新CMakeLists.txt文件

确保你的CMakeLists.txt文件正确配置了libssh2库的包含路径和库文件路径：

```
cmake_minimum_required(VERSION 3.14)

project(SSHClientDemo LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Quick)

# 设置libssh2库的路径
set(LIBSSH2_DIR ${CMAKE_SOURCE_DIR}/libssh2)

# 添加libssh2库的包含路径和库文件
include_directories(${LIBSSH2_DIR}/include)
link_directories(${LIBSSH2_DIR})

qt_add_executable(SSHClientDemo
    main.cpp
    sshclient.cpp
    sshclient.h
)

# 链接libssh2库
target_link_libraries(SSHClientDemo PRIVATE Qt6::Quick ${LIBSSH2_DIR}/libssh2.lib)

qt_add_qml_module(SSHClientDemo
    URI SSHClient
    VERSION 1.0
    QML_FILES main.qml
)
```

#### 确保DLL文件在运行时可被找到

将libssh2.dll文件复制到可执行文件所在的目录，或者将其路径添加到系统的PATH环境变量中。这样，运行时系统就可以找到该DLL文件。

通过这些步骤，你应该能够在Windows平台上编译并生成适用于你的项目的libssh2.dll文件，并正确配置CMakeLists.txt文件以链接此库。如果你有任何问题或需要进一步的帮助，请随时告诉我。

如果你已经成功编译了libssh2库，并且在`F:\libssh2\build\src\Release`目录下找到了`libssh2.dll`、`libssh2.exp`、`libssh2.lib`、和`libssh2_static.lib`文件，但没有找到`libssh2.h`头文件，那么你需要从libssh2的源代码中找到并复制头文件。

#### 获取libssh2.h头文件

1. **找到并复制头文件**：
   * 进入libssh2的源代码目录，头文件通常位于`include`目录或类似的目录中。
   * 复制`libssh2.h`文件到你的项目目录中的`include`文件夹。

#### 示例路径

假设libssh2源代码在`F:\libssh2\`目录下，你可以在`F:\libssh2\include\`中找到`libssh2.h`。将其复制到你的项目目录中，例如：

```
MySSHProject/
├── include/
│   └── libssh2.h
├── libssh2/
│   ├── libssh2.dll
│   ├── libssh2.exp
│   ├── libssh2.lib
│   └── libssh2_static.lib
├── CMakeLists.txt
├── main.cpp
├── sshclient.cpp
├── sshclient.h
└── main.qml
```

附加解决方案：

**删除CMake缓存文件和CMakeFiles目录**：

```
rm -rf CMakeCache.txt CMakeFiles
```

***

gemini版本的编译libssh2

好的，请复制以下内容作为您的笔记：

目录结构

```powershell
D:\src\
├── libssh2\
│   └── libssh2-1.11.1\
│       ├── (libssh2 源代码文件和文件夹，包括 CMakeLists.txt)
│   └── build\
│       ├── (libssh2 构建过程中生成的文件和文件夹)
├── zlib_install\
│   └── zlib-1.3.1\
│       ├── (zlib 源代码文件和文件夹，包括 CMakeLists.txt)
│   └── build\
│       ├── (zlib 构建过程中生成的文件和文件夹)
└── output\
    └── libssh2\
        ├── bin\
        │   └── (可能包含 libssh2 的可执行文件，例如 sftp)
        ├── include\
        │   └── libssh2.h
        │   └── libssh2\
        │       ├── (其他 libssh2 头文件)
        ├── lib\
        │   ├── ssh.lib
        │   └── libssh2.lib
        │   └── (或其他 libssh2 库文件)
        └── CMake\
            └── libssh2\
                ├── libssh2-config.cmake
                └── libssh2-config-version.cmake
```

**Zlib 编译和安装教程 (Windows):**

1. **准备源代码:**
   * 确保您已下载 Zlib 源代码并解压到 `D:\src\zlib_install\zlib-1.3.1`。
2. **创建构建目录:**

```powershell
mkdir D:\src\zlib_install\build
cd D:\src\zlib_install\build
```

3. 配置 CMake:

* 构建静态库 (推荐):

```powershell
cmake D:\src\zlib_install\zlib-1.3.1 -G "Visual Studio 17 2022" -A x64 -DCMAKE_INSTALL_PREFIX="D:\src\zlib_install" -DBUILD_SHARED_LIBS=OFF
```

(将 `"Visual Studio 17 2022"` 替换为您的 Visual Studio 版本)

* 构建共享库 (动态库):

```powershell
cmake D:\src\zlib_install\zlib-1.3.1 -G "Visual Studio 17 2022" -A x64 -DCMAKE_INSTALL_PREFIX="D:\src\zlib_install" -DBUILD_SHARED_LIBS=ON
```

(将 `"Visual Studio 17 2022"` 替换为您的 Visual Studio 版本)

4. 构建 Zlib:

```powershell
cmake --install . --config Release
```

(将 `Release` 替换为 `Debug` 如果需要调试版本)

libssh2 编译和安装教程 (Windows，依赖已安装的 Zlib 和 OpenSSL):

1. 准备源代码:

确保您已下载 libssh2 源代码并解压到 `D:\src\libssh2\libssh2-1.11.1`。

2. 创建构建目录:

```powershell
mkdir D:\src\libssh2\build
cd D:\src\libssh2\build
```

3. 配置 CMake:

* 如果 Zlib 构建为静态库:

```powershell
cmake D:\src\libssh2\libssh2-1.11.1 -G "Visual Studio 17 2022" -A x64 `
-DCMAKE_INSTALL_PREFIX="D:\src\output\libssh2" `
-DCMAKE_BUILD_TYPE=Release `
-DLIBSSH2_BUILD_EXAMPLES=OFF `
-DLIBSSH2_BUILD_TESTING=OFF `
-DLIBSSH2_STATIC_LIB=ON `
-DLIBSSH2_WITH_ZLIB=ON `
-DZLIB_INCLUDE_DIR="D:\src\zlib_install\include" `
-DZLIB_LIBRARY="D:\src\zlib_install\lib\zlibstatic.lib" `
-DLIBSSH2_WITH_OPENSSL=ON `
-DOPENSSL_ROOT_DIR="C:\Program Files\OpenSSL-Win64"
```

(将 `"Visual Studio 17 2022"` 替换为您的 Visual Studio 版本)

* 如果 Zlib 构建为共享库 (动态库):

```powershell
cmake D:\src\libssh2\libssh2-1.11.1 -G "Visual Studio 17 2022" -A x64 `
-DCMAKE_INSTALL_PREFIX="D:\src\output\libssh2" `
-DCMAKE_BUILD_TYPE=Release `
-DLIBSSH2_BUILD_EXAMPLES=OFF `
-DLIBSSH2_BUILD_TESTING=OFF `
-DLIBSSH2_STATIC_LIB=OFF `
-DLIBSSH2_WITH_ZLIB=ON `
-DZLIB_INCLUDE_DIR="D:\src\zlib_install\include" `
-DZLIB_LIBRARY="D:\src\zlib_install\lib\zlib.lib" `
-DLIBSSH2_WITH_OPENSSL=ON `
-DOPENSSL_ROOT_DIR="C:\Program Files\OpenSSL-Win64"
```

(将 `"Visual Studio 17 2022"` 替换为您的 Visual Studio 版本)

4. 构建 libssh2:

```powerquery
cmake --build . --config Release
```

(将 `Release` 替换为 `Debug` 如果需要调试版本)

5. 安装 libssh2:

```powershell
cmake --install . --config Release
```

(将 `Release` 替换为 `Debug` 如果需要调试版本)

DCShell 项目 `CMakeLists.txt` 配置 (集成已安装的 libssh2):

1. 修改 `find_package(libssh QUIET)` 部分为：

```powershell
find_package(libssh2 REQUIRED CONFIG PATHS "D:/src/output/libssh2/CMake/libssh2")
if(libssh2_FOUND)
    message(STATUS "libssh2 found: ${LIBSSH2_LIBRARIES}")
    message(STATUS "libssh2 include dir: ${LIBSSH2_INCLUDE_DIRS}")
else()
    message(FATAL_ERROR "libssh2 not found. Please check the installation path.")
endif()
```

2. 更新 `target_include_directories`：

```powershell
target_include_directories(DCShell PRIVATE
    ${LIBSSH2_INCLUDE_DIRS}
    ${OPENSSL_INCLUDE_DIRS}
    "D:/src/vcpkg/installed/x64-windows-static/include" # 如果您仍然需要 vcpkg 的头文件
)
```

3. 更新 `target_link_libraries`：

```powershell
target_link_libraries(DCShell PRIVATE
    Qt${QT_VERSION_MAJOR}::Widgets
    ${LIBSSH2_LIBRARIES}
    ${OPENSSL_LIBRARIES}
    ws2_32.lib
)
```

请注意替换命令中的 Visual Studio 版本为您实际使用的版本。完成以上步骤后，您应该能够成功地在您的 DCShell 项目中使用 libssh2 库了。

将 `libcrypto-3-x64.dll`, `libssl-3-x64.dll`, 和 `zlib.dll` 从它们各自的安装/构建目录复制到 `D:\src\output\libssh2\bin` 目录的 PowerShell 教程

```powershell
# 设置目标 bin 目录路径
$TargetBinPath = "D:\src\output\libssh2\bin"

# 确保目标 bin 目录存在
if (-not (Test-Path $TargetBinPath -PathType Container)) {
    New-Item -ItemType Directory -Path $TargetBinPath -Force
}

# --- 复制 OpenSSL DLLs ---
# 设置 OpenSSL 的 bin 目录路径 (请根据您的实际安装路径修改)
$OpenSSLBinPath = "C:\Program Files\OpenSSL-Win64\bin"

# 复制 libcrypto-3-x64.dll
$CryptoSource = Join-Path $OpenSSLBinPath "libcrypto-3-x64.dll"
$CryptoDestination = Join-Path $TargetBinPath "libcrypto-3-x64.dll"
if (Test-Path $CryptoSource) {
    Copy-Item $CryptoSource $CryptoDestination -Force
    Write-Host "已复制: $CryptoSource -> $CryptoDestination"
} else {
    Write-Warning "未找到 OpenSSL 加密库: $CryptoSource"
}

# 复制 libssl-3-x64.dll
$SSLSource = Join-Path $OpenSSLBinPath "libssl-3-x64.dll"
$SSLDestination = Join-Path $TargetBinPath "libssl-3-x64.dll"
if (Test-Path $SSLSource) {
    Copy-Item $SSLSource $SSLDestination -Force
    Write-Host "已复制: $SSLSource -> $SSLDestination"
} else {
    Write-Warning "未找到 OpenSSL SSL 库: $SSLSource"
}

# --- 复制 Zlib DLL ---
# 设置 Zlib 的 bin 目录路径 (请根据您的实际构建路径修改)
$ZlibBinPath = "D:\src\zlib_install\bin"
$ZlibFileName = "zlib.dll" # 根据您实际的文件名修改

$ZlibSource = Join-Path $ZlibBinPath $ZlibFileName
$ZlibDestination = Join-Path $TargetBinPath $ZlibFileName
if (Test-Path $ZlibSource) {
    Copy-Item $ZlibSource $ZlibDestination -Force
    Write-Host "已复制: $ZlibSource -> $ZlibDestination"
} else {
    Write-Warning "未找到 Zlib DLL: $ZlibSource。请确保您已构建 Zlib 共享库并检查路径。"
}

Write-Host "DLL 文件复制完成。"
```

**请务必按照以下说明使用此教程：**

1. **打开 Windows PowerShell。**
2. **复制上面的整个代码块。**
3. **粘贴到 PowerShell 窗口中。**
4. **在运行之前，请仔细检查并修改以下变量以匹配您的实际环境：**
   * `$OpenSSLBinPath`: 将 `"C:\Program Files\OpenSSL-Win64\bin"` 替换为您 OpenSSL 的实际安装 `bin` 目录。
   * `$ZlibBinPath`: 将 `"D:\src\zlib_install\bin"` 替换为您 Zlib 构建输出的 `bin` 目录。
   * `$ZlibFileName`: 确认 `"zlib.dll"` 是您 Zlib 实际生成的 DLL 文件名。如果不是，请修改为正确的文件名（例如 `zlibwapi.dll` 或带有版本号的名称）。
5. **按下 Enter 键执行脚本。**

脚本执行后，您将在 PowerShell 窗口中看到复制操作的结果。如果一切顺利，`libcrypto-3-x64.dll`, `libssl-3-x64.dll`, 和 `zlib.dll` 将会出现在 `D:\src\output\libssh2\bin` 目录下。

**请记住，这只是一个复制 DLL 文件的临时解决方案。最终，您应该努力配置您的项目以实现真正的静态链接，或者确保这些 DLL 文件在您的应用程序运行时能够被正确地找到（例如，通过 PATH 环境变量或与您的可执行文件放在一起）。**
