<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.dannyxu.net/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.dannyxu.net/" rel="alternate" type="text/html" hreflang="zh" /><updated>2026-04-16T15:58:27+08:00</updated><id>https://www.dannyxu.net/feed.xml</id><title type="html">Danny许的学习记录</title><subtitle>书山有路勤为径 学海无涯苦作舟
</subtitle><author><name>Danny Xu</name></author><entry><title type="html">tfs备份问题</title><link href="https://www.dannyxu.net/2026/03/11/tfs-backup-error.html" rel="alternate" type="text/html" title="tfs备份问题" /><published>2026-03-11T00:00:00+08:00</published><updated>2026-03-11T00:00:00+08:00</updated><id>https://www.dannyxu.net/2026/03/11/tfs-backup-error</id><content type="html" xml:base="https://www.dannyxu.net/2026/03/11/tfs-backup-error.html"><![CDATA[<h1 id="前言">前言</h1>
<p>在添加TFS备份任务时，我遇到了如下几个问题：</p>

<ol>
  <li>TF401009:Azure DevOps 服务账户 NT AUTHORITY\LOCAL SERVICE 无法访问网络共享。请更改为可访问备份路径的账户。</li>
  <li>SQL实例“XXXXX”上的数据库“XXXXXX”正在使用简单恢复模式，该模式不能用于拆功能键所有 Azure DevOps 数据库的事务一致性备份。所有Azure DevOps 数据库都必须使用完整恢复模式来创建备份计划。</li>
  <li>TF401002: SQL Server 数据库引擎未能将数据库备份保存到路径 \xxxxx\source_backup。  请向 SQL 服务帐户授予对该文件夹的读/写访问权限。</li>
</ol>

<h1 id="tf401009">TF401009</h1>
<p>该问题可以通过切换 <code class="language-plaintext highlighter-rouge">Azure DevOps Server服务账户</code> 解决。</p>
<ol>
  <li>启动 <code class="language-plaintext highlighter-rouge">Azure DevOps Server 管理控制台</code> 。</li>
  <li>在 <code class="language-plaintext highlighter-rouge">服务器名称-应用层</code>页面的右侧，点击<code class="language-plaintext highlighter-rouge">更改账户</code>
<img src="\images\2026-03-11\5.png" alt="更改账户" /></li>
  <li>在<code class="language-plaintext highlighter-rouge">更改服务账户</code>处，选择<code class="language-plaintext highlighter-rouge">使用用户账户</code>，并输入有备份路径权限的客户即可。注意这个用户全新建议较高，避免影响当前服务运行。
<img src="\images\2026-03-11\6.png" alt="使用用户账户" /></li>
</ol>

<h1 id="完整恢复模式">完整恢复模式</h1>
<p>该问题是由于错误信息中的数据库可能是经过恢复、还原或人工调整过数据库的备份模式导致的。
正常TFS默认创建的数据库都是完整恢复模式。
修改数据库模式方法如下：</p>
<ol>
  <li>启动 <code class="language-plaintext highlighter-rouge">Microsoft SQL Server Management Statudio</code> (<code class="language-plaintext highlighter-rouge">SSMS</code>)。</li>
  <li>连接 <code class="language-plaintext highlighter-rouge">SQL Server 服务器</code></li>
  <li>在数据库中找到前面错误提示信息中的数据库。</li>
  <li>点击<code class="language-plaintext highlighter-rouge">右键菜单-属性</code>
<img src="\images\2026-03-11\1.png" alt="数据库属性" /></li>
  <li>在属性对话框中，将 <code class="language-plaintext highlighter-rouge">选项-恢复模式</code> 中修改为 <code class="language-plaintext highlighter-rouge">完整</code>。
<img src="\images\2026-03-11\2.png" alt="恢复模式" /></li>
  <li>修改后由，重启 <code class="language-plaintext highlighter-rouge">SQL Server 服务器</code></li>
</ol>

<h1 id="tf401002">TF401002</h1>
<p>该错误原因是因为 <code class="language-plaintext highlighter-rouge">SQL Server</code> 服务没有对备份路径的访问权限。</p>

<ol>
  <li>执行 <code class="language-plaintext highlighter-rouge">services.msc</code> 启动服务管理程序。</li>
  <li>找到 <code class="language-plaintext highlighter-rouge">SQL Server</code> 服务，点击 <code class="language-plaintext highlighter-rouge">右键菜单-属性</code>。
<img src="\images\2026-03-11\3.png" alt="服务属性" /></li>
  <li>选择 <code class="language-plaintext highlighter-rouge">登录-此账户</code> ，并输入有权限访问备份路径的 <code class="language-plaintext highlighter-rouge">本机账户</code>。需要注意的是，这里的账户如果权限不够又可能导致其它运行问题，所以我直接使用了管理员账户。
<img src="\images\2026-03-11\4.png" alt="登录" /></li>
  <li>重启 <code class="language-plaintext highlighter-rouge">SQL Server</code> 服务。</li>
</ol>]]></content><author><name>Danny Xu</name></author><category term="TFS" /><summary type="html"><![CDATA[前言 在添加TFS备份任务时，我遇到了如下几个问题： TF401009:Azure DevOps 服务账户 NT AUTHORITY\LOCAL SERVICE 无法访问网络共享。请更改为可访问备份路径的账户。 SQL实例“XXXXX”上的数据库“XXXXXX”正在使用简单恢复模式，该模式不能用于拆功能键所有 Azure DevOps 数据库的事务一致性备份。所有Azure DevOps 数据库都必须使用完整恢复模式来创建备份计划。 TF401002: SQL Server 数据库引擎未能将数据库备份保存到路径 \xxxxx\source_backup。 请向 SQL 服务帐户授予对该文件夹的读/写访问权限。 TF401009 该问题可以通过切换 Azure DevOps Server服务账户 解决。 启动 Azure DevOps Server 管理控制台 。 在 服务器名称-应用层页面的右侧，点击更改账户 在更改服务账户处，选择使用用户账户，并输入有备份路径权限的客户即可。注意这个用户全新建议较高，避免影响当前服务运行。 完整恢复模式 该问题是由于错误信息中的数据库可能是经过恢复、还原或人工调整过数据库的备份模式导致的。 正常TFS默认创建的数据库都是完整恢复模式。 修改数据库模式方法如下： 启动 Microsoft SQL Server Management Statudio (SSMS)。 连接 SQL Server 服务器 在数据库中找到前面错误提示信息中的数据库。 点击右键菜单-属性 在属性对话框中，将 选项-恢复模式 中修改为 完整。 修改后由，重启 SQL Server 服务器 TF401002 该错误原因是因为 SQL Server 服务没有对备份路径的访问权限。 执行 services.msc 启动服务管理程序。 找到 SQL Server 服务，点击 右键菜单-属性。 选择 登录-此账户 ，并输入有权限访问备份路径的 本机账户。需要注意的是，这里的账户如果权限不够又可能导致其它运行问题，所以我直接使用了管理员账户。 重启 SQL Server 服务。]]></summary></entry><entry><title type="html">Windows 和 Linux 交叉编译</title><link href="https://www.dannyxu.net/2025/02/14/cross-compile-win-linux.html" rel="alternate" type="text/html" title="Windows 和 Linux 交叉编译" /><published>2025-02-14T00:00:00+08:00</published><updated>2025-02-14T00:00:00+08:00</updated><id>https://www.dannyxu.net/2025/02/14/cross-compile-win-linux</id><content type="html" xml:base="https://www.dannyxu.net/2025/02/14/cross-compile-win-linux.html"><![CDATA[<h1 id="前言">前言</h1>
<p>通过CMake设置好项目后，设置编译工具链。</p>

<p>在Windows上生成Linux项目的可执行文件或库，需要使用交叉编译工具链。以下是几种常见的方法和工具，可以帮助你在Windows上进行Linux项目的编译：</p>
<ol>
  <li>使用MSYS2进行交叉编译</li>
</ol>

<p><a href="https://www.msys2.org">MSYS2</a>是一个基于MinGW-w64的工具，提供了一个类Unix环境和完整的交叉编译工具链，支持在Windows上编译Linux项目。
步骤
安装MSYS2：
从MSYS2官网下载安装包并安装。
安装完成后，启动MSYS2 Shell。
更新MSYS2：
bash
复制
pacman -Syu
安装交叉编译工具链：
安装MinGW-w64工具链：
bash
复制
pacman -S mingw-w64-x86_64-toolchain
配置交叉编译环境：
创建一个工具链文件（如toolchain-linux.cmake），指定交叉编译工具链：
cmake
复制
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
使用CMake进行编译：
在CMake中指定工具链文件：
cmake
复制
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-linux.cmake ..
make</p>
<ol>
  <li>使用MinGW-w64
MinGW-w64是一个跨平台的C/C++编译器，支持在Windows上编译Linux项目。
步骤
安装MinGW-w64：
在Windows上安装MinGW-w64。可以从MinGW-w64官网下载安装包。
配置环境变量：
将MinGW-w64的bin目录添加到系统环境变量PATH中。
创建工具链文件：
创建一个工具链文件（如toolchain-linux.cmake）：
cmake
复制
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
使用CMake进行编译：
在CMake中指定工具链文件：
cmake
复制
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-linux.cmake ..
make</li>
  <li>使用WSL（Windows Subsystem for Linux）
WSL允许你在Windows上运行Linux发行版，从而使用Linux的工具链进行编译。
步骤
安装WSL：
在Windows中安装WSL。可以通过Microsoft Store安装Ubuntu或其他Linux发行版。
安装交叉编译工具链：
在WSL中安装交叉编译工具链：
bash
复制
sudo apt update
sudo apt install gcc-x86-64-linux-gnu g++-x86-64-linux-gnu
配置工具链文件：
创建一个工具链文件（如toolchain-linux.cmake）：
cmake
复制
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER x86_64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER x86_64-linux-gnu-g++)
使用CMake进行编译：
在CMake中指定工具链文件：
cmake
复制
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-linux.cmake ..
make</li>
  <li>使用Cygwin
Cygwin是一个在Windows上提供类Unix环境的工具，支持交叉编译。
步骤
安装Cygwin：
从Cygwin官网下载安装包并安装。
安装交叉编译工具链：
在Cygwin中安装交叉编译工具链：
bash
复制
setup-x86_64.exe -q -P gcc-g++-x86_64-linux-gnu
配置工具链文件：
创建一个工具链文件（如toolchain-linux.cmake）：
cmake
复制
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER x86_64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER x86_64-linux-gnu-g++)
使用CMake进行编译：
在CMake中指定工具链文件：
cmake
复制
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-linux.cmake ..
make
总结
在Windows上生成Linux项目的可执行文件或库，可以通过以下几种方法实现：
使用MSYS2和MinGW-w64进行交叉编译。
使用WSL（Windows Subsystem for Linux）。
使用Cygwin。
根据你的需求选择合适的工具和方法。</li>
</ol>

<h1 id="安装">安装</h1>
<p>太简单了，省略。</p>

<h1 id="cmake说明">CMake说明</h1>

<h2 id="简介">简介</h2>
<p>在项目文件夹内部，<code class="language-plaintext highlighter-rouge">CMake</code>的配置是通过<code class="language-plaintext highlighter-rouge">CMakeLists.txt</code>进行配置的。
子项目的配置通常是通过文件夹层级来维护的，这就意味着子文件夹中也需要有自己的<code class="language-plaintext highlighter-rouge">CMakeLists.txt</code>文件。</p>

<p>为了方便描述，下文件假设当前的软件叫<code class="language-plaintext highlighter-rouge">RX</code>，拥有如下3个项目:</p>
<ol>
  <li><code class="language-plaintext highlighter-rouge">System</code> 静态链接库，产生<code class="language-plaintext highlighter-rouge">lib</code>。</li>
  <li><code class="language-plaintext highlighter-rouge">Interface</code> 动态链接库，依赖<code class="language-plaintext highlighter-rouge">System</code>，产生<code class="language-plaintext highlighter-rouge">.dll</code>和<code class="language-plaintext highlighter-rouge">.lib</code>。</li>
  <li><code class="language-plaintext highlighter-rouge">Main</code> 主程序，依赖<code class="language-plaintext highlighter-rouge">System</code>和<code class="language-plaintext highlighter-rouge">Interface</code>。</li>
</ol>

<h2 id="目录组织如下">目录组织如下</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>RX
|- CMakeLists.txt
|- Project
    |- System
        |- CMakeLists.txt
        |- stdafx.h
        |- system.cpp
    |- Interface
        CMakeLists.txt
        |- stdafx.h
        |- system.cpp
    |- Main--
        |- CMakeLists.txt
        |- stdafx.h
        |- main.cpp


</code></pre></div></div>

<h2 id="根目录下的cmake配置">根目录下的<code class="language-plaintext highlighter-rouge">CMake</code>配置</h2>

<div class="language-cmake highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># CMake程序的版本要求，如果不满足，运行时会提示错误</span>
<span class="nb">cmake_minimum_required</span><span class="p">(</span>VERSION 3.0<span class="p">)</span>

<span class="c1">####################################</span>
<span class="c1"># 项目名称</span>
<span class="c1">####################################</span>
<span class="nb">project</span><span class="p">(</span>RX<span class="p">)</span>



</code></pre></div></div>]]></content><author><name>Danny Xu</name></author><category term="KDE,KDevelop" /><summary type="html"><![CDATA[前言 通过CMake设置好项目后，设置编译工具链。 在Windows上生成Linux项目的可执行文件或库，需要使用交叉编译工具链。以下是几种常见的方法和工具，可以帮助你在Windows上进行Linux项目的编译： 使用MSYS2进行交叉编译 MSYS2是一个基于MinGW-w64的工具，提供了一个类Unix环境和完整的交叉编译工具链，支持在Windows上编译Linux项目。 步骤 安装MSYS2： 从MSYS2官网下载安装包并安装。 安装完成后，启动MSYS2 Shell。 更新MSYS2： bash 复制 pacman -Syu 安装交叉编译工具链： 安装MinGW-w64工具链： bash 复制 pacman -S mingw-w64-x86_64-toolchain 配置交叉编译环境： 创建一个工具链文件（如toolchain-linux.cmake），指定交叉编译工具链： cmake 复制 set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) 使用CMake进行编译： 在CMake中指定工具链文件： cmake 复制 cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-linux.cmake .. make 使用MinGW-w64 MinGW-w64是一个跨平台的C/C++编译器，支持在Windows上编译Linux项目。 步骤 安装MinGW-w64： 在Windows上安装MinGW-w64。可以从MinGW-w64官网下载安装包。 配置环境变量： 将MinGW-w64的bin目录添加到系统环境变量PATH中。 创建工具链文件： 创建一个工具链文件（如toolchain-linux.cmake）： cmake 复制 set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) 使用CMake进行编译： 在CMake中指定工具链文件： cmake 复制 cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-linux.cmake .. make 使用WSL（Windows Subsystem for Linux） WSL允许你在Windows上运行Linux发行版，从而使用Linux的工具链进行编译。 步骤 安装WSL： 在Windows中安装WSL。可以通过Microsoft Store安装Ubuntu或其他Linux发行版。 安装交叉编译工具链： 在WSL中安装交叉编译工具链： bash 复制 sudo apt update sudo apt install gcc-x86-64-linux-gnu g++-x86-64-linux-gnu 配置工具链文件： 创建一个工具链文件（如toolchain-linux.cmake）： cmake 复制 set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER x86_64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER x86_64-linux-gnu-g++) 使用CMake进行编译： 在CMake中指定工具链文件： cmake 复制 cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-linux.cmake .. make 使用Cygwin Cygwin是一个在Windows上提供类Unix环境的工具，支持交叉编译。 步骤 安装Cygwin： 从Cygwin官网下载安装包并安装。 安装交叉编译工具链： 在Cygwin中安装交叉编译工具链： bash 复制 setup-x86_64.exe -q -P gcc-g++-x86_64-linux-gnu 配置工具链文件： 创建一个工具链文件（如toolchain-linux.cmake）： cmake 复制 set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER x86_64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER x86_64-linux-gnu-g++) 使用CMake进行编译： 在CMake中指定工具链文件： cmake 复制 cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-linux.cmake .. make 总结 在Windows上生成Linux项目的可执行文件或库，可以通过以下几种方法实现： 使用MSYS2和MinGW-w64进行交叉编译。 使用WSL（Windows Subsystem for Linux）。 使用Cygwin。 根据你的需求选择合适的工具和方法。 安装 太简单了，省略。 CMake说明 简介 在项目文件夹内部，CMake的配置是通过CMakeLists.txt进行配置的。 子项目的配置通常是通过文件夹层级来维护的，这就意味着子文件夹中也需要有自己的CMakeLists.txt文件。 为了方便描述，下文件假设当前的软件叫RX，拥有如下3个项目: System 静态链接库，产生lib。 Interface 动态链接库，依赖System，产生.dll和.lib。 Main 主程序，依赖System和Interface。 目录组织如下 RX |- CMakeLists.txt |- Project |- System |- CMakeLists.txt |- stdafx.h |- system.cpp |- Interface CMakeLists.txt |- stdafx.h |- system.cpp |- Main-- |- CMakeLists.txt |- stdafx.h |- main.cpp 根目录下的CMake配置 # CMake程序的版本要求，如果不满足，运行时会提示错误 cmake_minimum_required(VERSION 3.0) #################################### # 项目名称 #################################### project(RX)]]></summary></entry><entry><title type="html">玩转CMake</title><link href="https://www.dannyxu.net/2025/02/14/play-cmake.html" rel="alternate" type="text/html" title="玩转CMake" /><published>2025-02-14T00:00:00+08:00</published><updated>2025-02-14T00:00:00+08:00</updated><id>https://www.dannyxu.net/2025/02/14/play-cmake</id><content type="html" xml:base="https://www.dannyxu.net/2025/02/14/play-cmake.html"><![CDATA[<h1 id="前言">前言</h1>
<p>今日需要将项目迁移到Linux上，那么首先要做的就是创建Linux上的项目啦~</p>

<p>这就要清楚大名鼎鼎的CMake。</p>

<p>由于网上的教程都是简单的小型项目示例，所以参考起来总是缺点东西。</p>

<p>我这里就用实际大型项目简化出来的项目作为，示例吧~</p>

<h1 id="安装">安装</h1>
<p>太简单了，省略。</p>

<h1 id="cmake说明">CMake说明</h1>

<h2 id="简介">简介</h2>
<p>在项目文件夹内部，<code class="language-plaintext highlighter-rouge">CMake</code>的配置是通过<code class="language-plaintext highlighter-rouge">CMakeLists.txt</code>进行配置的。
子项目的配置通常是通过文件夹层级来维护的，这就意味着子文件夹中也需要有自己的<code class="language-plaintext highlighter-rouge">CMakeLists.txt</code>文件。</p>

<p>为了方便描述，下文件假设当前的软件叫<code class="language-plaintext highlighter-rouge">RX</code>，拥有如下3个项目:</p>
<ol>
  <li><code class="language-plaintext highlighter-rouge">System</code> 静态链接库，产生<code class="language-plaintext highlighter-rouge">lib</code>。</li>
  <li><code class="language-plaintext highlighter-rouge">Interface</code> 动态链接库，依赖<code class="language-plaintext highlighter-rouge">System</code>，产生<code class="language-plaintext highlighter-rouge">.dll</code>和<code class="language-plaintext highlighter-rouge">.lib</code>。</li>
  <li><code class="language-plaintext highlighter-rouge">Main</code> 主程序，依赖<code class="language-plaintext highlighter-rouge">System</code>和<code class="language-plaintext highlighter-rouge">Interface</code>。</li>
</ol>

<h2 id="目录组织如下">目录组织如下</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>RX
|- CMakeLists.txt
|- Project
    |- System
        |- CMakeLists.txt
        |- stdafx.h
        |- system.cpp
    |- Interface
        CMakeLists.txt
        |- stdafx.h
        |- system.cpp
    |- Main--
        |- CMakeLists.txt
        |- stdafx.h
        |- main.cpp


</code></pre></div></div>

<h2 id="根目录下的cmake配置">根目录下的<code class="language-plaintext highlighter-rouge">CMake</code>配置</h2>

<div class="language-cmake highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># CMake程序的版本要求，如果不满足，运行时会提示错误</span>
<span class="nb">cmake_minimum_required</span><span class="p">(</span>VERSION 3.0<span class="p">)</span>

<span class="c1">####################################</span>
<span class="c1"># 项目名称</span>
<span class="c1">####################################</span>
<span class="nb">project</span><span class="p">(</span>RX<span class="p">)</span>



</code></pre></div></div>]]></content><author><name>Danny Xu</name></author><category term="KDE,KDevelop" /><summary type="html"><![CDATA[前言 今日需要将项目迁移到Linux上，那么首先要做的就是创建Linux上的项目啦~ 这就要清楚大名鼎鼎的CMake。 由于网上的教程都是简单的小型项目示例，所以参考起来总是缺点东西。 我这里就用实际大型项目简化出来的项目作为，示例吧~ 安装 太简单了，省略。 CMake说明 简介 在项目文件夹内部，CMake的配置是通过CMakeLists.txt进行配置的。 子项目的配置通常是通过文件夹层级来维护的，这就意味着子文件夹中也需要有自己的CMakeLists.txt文件。 为了方便描述，下文件假设当前的软件叫RX，拥有如下3个项目: System 静态链接库，产生lib。 Interface 动态链接库，依赖System，产生.dll和.lib。 Main 主程序，依赖System和Interface。 目录组织如下 RX |- CMakeLists.txt |- Project |- System |- CMakeLists.txt |- stdafx.h |- system.cpp |- Interface CMakeLists.txt |- stdafx.h |- system.cpp |- Main-- |- CMakeLists.txt |- stdafx.h |- main.cpp 根目录下的CMake配置 # CMake程序的版本要求，如果不满足，运行时会提示错误 cmake_minimum_required(VERSION 3.0) #################################### # 项目名称 #################################### project(RX)]]></summary></entry><entry><title type="html">KDE相关文件下载</title><link href="https://www.dannyxu.net/2025/02/11/kde-download.html" rel="alternate" type="text/html" title="KDE相关文件下载" /><published>2025-02-11T00:00:00+08:00</published><updated>2025-02-11T00:00:00+08:00</updated><id>https://www.dannyxu.net/2025/02/11/kde-download</id><content type="html" xml:base="https://www.dannyxu.net/2025/02/11/kde-download.html"><![CDATA[<h1 id="说明">说明</h1>
<p>KDE官方下载页面已经好久没有维护了。</p>

<p>现在的二进制生成好像是GitLab 自动生成。</p>

<p>其下载页面地址为 <a href="https://cdn.kde.org/ci-builds/">https://cdn.kde.org/ci-builds/</a></p>]]></content><author><name>Danny Xu</name></author><category term="KDE" /><summary type="html"><![CDATA[说明 KDE官方下载页面已经好久没有维护了。 现在的二进制生成好像是GitLab 自动生成。 其下载页面地址为 https://cdn.kde.org/ci-builds/]]></summary></entry><entry><title type="html">玩转kdevelop</title><link href="https://www.dannyxu.net/2025/02/11/play-kdevelop.html" rel="alternate" type="text/html" title="玩转kdevelop" /><published>2025-02-11T00:00:00+08:00</published><updated>2025-02-11T00:00:00+08:00</updated><id>https://www.dannyxu.net/2025/02/11/play-kdevelop</id><content type="html" xml:base="https://www.dannyxu.net/2025/02/11/play-kdevelop.html"><![CDATA[<h1 id="前言">前言</h1>

<h1 id="安装">安装</h1>

<h2 id="windows版本">Windows版本</h2>
<p>能安装，但是缺少文件<code class="language-plaintext highlighter-rouge">Qt6Core5Compat.dll</code>，复制官方较新的Qt6.8.1中的对应文件到程序目录中，可以正常启动。</p>

<p>但是在创建项目及打开项目时会死机。</p>

<h2 id="linux版本">Linux版本</h2>

<h3 id="使用appstore安装">使用AppStore安装</h3>
<p>呃安装失败</p>

<h3 id="使用命令行安装">使用命令行安装</h3>
<p>执行以下命令:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install kdevelop
</code></pre></div></div>
<p>安装后，直接执行<code class="language-plaintext highlighter-rouge">kdevelop</code>即可启动。</p>

<h3 id="注意1">注意1</h3>
<p>如果启动后出现如下提示信息：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kdevelop error:Could not load project management plugin KDevCMakeManager
</code></pre></div></div>

<p>说明未安装CMake，执行以下命令安装:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install cmake
</code></pre></div></div>

<h3 id="注意2">注意2</h3>
<p>如果编译<code class="language-plaintext highlighter-rouge">Qt5</code>项目时，出现以下错误信息:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>package configuration file "Qt5Qml" not found
</code></pre></div></div>

<p>这是由于当前<code class="language-plaintext highlighter-rouge">KDevelop</code>编译依赖的<code class="language-plaintext highlighter-rouge">Qt5</code>环境不完整，执行以下命令安装<code class="language-plaintext highlighter-rouge">Qt5</code>：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo  apt-get install qtdeclarative5-dev
</code></pre></div></div>

<h3 id="注意3">注意3</h3>
<p>如果编译<code class="language-plaintext highlighter-rouge">Qt6</code>项目时，出现以下错误信息:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Could not find a configuration file for package "ECM" that is compatible with requested version "6.0.0".
</code></pre></div></div>

<p>说明当前的<code class="language-plaintext highlighter-rouge">ECM(extra-cmake-modules)</code>版本不够，执行以下命令进行安装最新版本:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://invent.kde.org/frameworks/extra-cmake-modules.git 
cd extra-cmake-modules
mkdir build &amp;&amp; cd build    
cmake ..
make &amp;&amp; sudo make install
</code></pre></div></div>

<h2 id="注意4">注意4</h2>
<p>如果编译<code class="language-plaintext highlighter-rouge">Qt6</code>项目时，出现以下错误信息:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Could not find a configuration file for package "ECM" that is compatible with requested version "6.0.0".
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install qt6-base-dev
</code></pre></div></div>]]></content><author><name>Danny Xu</name></author><category term="KDE,KDevelop" /><summary type="html"><![CDATA[前言 安装 Windows版本 能安装，但是缺少文件Qt6Core5Compat.dll，复制官方较新的Qt6.8.1中的对应文件到程序目录中，可以正常启动。 但是在创建项目及打开项目时会死机。 Linux版本 使用AppStore安装 呃安装失败 使用命令行安装 执行以下命令: sudo apt-get install kdevelop 安装后，直接执行kdevelop即可启动。 注意1 如果启动后出现如下提示信息： kdevelop error:Could not load project management plugin KDevCMakeManager 说明未安装CMake，执行以下命令安装: sudo apt-get install cmake 注意2 如果编译Qt5项目时，出现以下错误信息: package configuration file "Qt5Qml" not found 这是由于当前KDevelop编译依赖的Qt5环境不完整，执行以下命令安装Qt5： sudo apt-get install qtdeclarative5-dev 注意3 如果编译Qt6项目时，出现以下错误信息: Could not find a configuration file for package "ECM" that is compatible with requested version "6.0.0". 说明当前的ECM(extra-cmake-modules)版本不够，执行以下命令进行安装最新版本: git clone https://invent.kde.org/frameworks/extra-cmake-modules.git cd extra-cmake-modules mkdir build &amp;&amp; cd build cmake .. make &amp;&amp; sudo make install 注意4 如果编译Qt6项目时，出现以下错误信息: Could not find a configuration file for package "ECM" that is compatible with requested version "6.0.0". sudo apt-get install qt6-base-dev]]></summary></entry><entry><title type="html">使用 WSL 安装 KUbuntu</title><link href="https://www.dannyxu.net/2025/02/11/play-with-wsl-kubuntu.html" rel="alternate" type="text/html" title="使用 WSL 安装 KUbuntu" /><published>2025-02-11T00:00:00+08:00</published><updated>2025-02-11T00:00:00+08:00</updated><id>https://www.dannyxu.net/2025/02/11/play-with-wsl-kubuntu</id><content type="html" xml:base="https://www.dannyxu.net/2025/02/11/play-with-wsl-kubuntu.html"><![CDATA[<h1 id="前言">前言</h1>
<p>手头的工作是需要做一下linux移植工作，突然想到以前总是用虚拟机安装Linux，从来没有尝试过WSL。</p>

<p>那就着手试试吧！</p>

<h1 id="安装-wsl">安装 wsl</h1>
<p>我这里简单写了，一般也可以顺利的安装。</p>

<p>详细的过程，可以参考文章<a href="https://blog.csdn.net/code_peak/article/details/128541617?ops_request_misc=&amp;request_id=&amp;biz_id=102&amp;utm_term=wsl2%E5%AE%89%E8%A3%85&amp;utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-128541617.142%5Ev96%5Epc_search_result_base6&amp;spm=1018.2226.3001.4187">WSL2安装和基本命令</a></p>

<h2 id="先安装-wsl-工具">先安装 wsl 工具</h2>
<p>命令行中执行以下命令</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wsl --install
</code></pre></div></div>
<p>安装后重启系统。</p>

<h2 id="安装子系统">安装子系统</h2>
<p>子系统有两种方式安装</p>

<h3 id="命令行">命令行</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># 查看可用linux版本
wsl --list --online

# 安装指定的linux版本
wsl --install -d &lt;DistroName&gt;
</code></pre></div></div>

<h3 id="商店安装">商店安装</h3>
<p>在 <code class="language-plaintext highlighter-rouge">Windows Store</code> 中，选择子系统安装。</p>

<h2 id="注意">注意</h2>
<p>必须启用以下Windows功能</p>

<ol>
  <li>Hyper-V</li>
  <li>Virtual Machine Platform</li>
  <li>适用于 Linux 的 Windows 子系统</li>
</ol>

<h1 id="安装桌面">安装桌面</h1>
<p>我选用的是 <code class="language-plaintext highlighter-rouge">KDE</code> 版本的UBUNTU，参考了文章<a href="https://blog.csdn.net/qq_30448087/article/details/134897586">WSL2 Ubuntu22.04安装KDE桌面</a></p>

<h2 id="安装命令">安装命令</h2>
<p>使用<code class="language-plaintext highlighter-rouge">apt</code>安装<code class="language-plaintext highlighter-rouge">KDE</code>桌面如下所示:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># 可以安装kubuntu-desktop或plasma-desktop，区别是前者更完整体积更大后者提供基本的桌面组件体积更小
sudo apt install kubuntu-desktop
</code></pre></div></div>

<h2 id="注意1">注意1</h2>
<p>安装桌面过程中遇到如下提示:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Initializing mlocate database; this may take some time
</code></pre></div></div>
<p>按照参考文章所说，这个过程其实是对配置中的目录进行全搜索，如果硬盘大会特别慢，2T据说要搜索6天。</p>

<p>这个时候不要急，我们可以调整搜索目录范围。</p>

<p>首先我们使用键盘快捷键 <code class="language-plaintext highlighter-rouge">CTRL</code>+<code class="language-plaintext highlighter-rouge">Z</code>，暂停桌面的安装进程（不用kill掉）。</p>

<p>你会看到进度条还在下方，但是此时可以输入命令了，输入如下命令：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># 使用 VIM 工具打开文件
sudo vim /etc/updatedb.conf
</code></pre></div></div>

<p>VIM工具进入后是命令状态，输入 <code class="language-plaintext highlighter-rouge">I</code>回车，进入编辑状态。</p>

<p>在 <code class="language-plaintext highlighter-rouge">"PRUNEPATHS:"</code> 变量后添加 <code class="language-plaintext highlighter-rouge">"/mnt"</code>。</p>

<p>编辑后，按<code class="language-plaintext highlighter-rouge">ESC键</code>返回命令状态，输入 <code class="language-plaintext highlighter-rouge">:wq</code> ，可以保存退出。</p>

<p>再次执行以下命令：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># jobs命令用于查看当前执行的任务，按理说此时应该只有一个安装进程
jobs

# fg命令用于返回之前暂停的任务，并继续执行，如果只有一个进程就正常输入
fg

</code></pre></div></div>
<p>执行<code class="language-plaintext highlighter-rouge">fg</code>命令后请等待，这时不会有屏幕刷新，但是后台其实正在执行，差不多1小时左右即可完成。</p>

<h2 id="注意2">注意2</h2>
<p>按照参考文章说，有人安装时候，需要执行下面的语句，但是我没遇到这个问题。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt purge -y acpid acpi-support modemmanager
apt-mark hold acpid acpi-support modemmanager
</code></pre></div></div>

<h1 id="安装-x-server">安装 X Server</h1>
<h2 id="安装xorg">安装xorg</h2>
<p><code class="language-plaintext highlighter-rouge">xorg</code>是显示服务器，实现了 <code class="language-plaintext highlighter-rouge">X Window</code> 系统的功能，主要负责管理计算机的显示设备和用户输入设备（如键盘和鼠标）。</p>

<p>执行命令：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install xorg
</code></pre></div></div>
<h2 id="安装xehpyr">安装Xehpyr</h2>
<p>Xephyr 是一个基于 <code class="language-plaintext highlighter-rouge">KDrive</code> 的嵌套 <code class="language-plaintext highlighter-rouge">X Window</code>，它允许在一个现有的 <code class="language-plaintext highlighter-rouge">X Window</code> 内部创建一个嵌套的 <code class="language-plaintext highlighter-rouge">X Window</code>，并在一个窗口中显示。</p>

<p>执行命令：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install xserver-xephyr
</code></pre></div></div>
<h2 id="设置环境变量">设置环境变量</h2>
<p>执行命令：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "export XDG_SESSION_TYPE=x11" &gt;&gt; ~/.profile
echo "export GDK_PLATFORM=x11" &gt;&gt; ~/.profile
echo "export GDK_BACKEND=x11" &gt;&gt; ~/.profile
echo "export QT_QPA_PLATFORM=xcb" &gt;&gt; ~/.profile
echo "export WAYLAND_DISPLAY=" &gt;&gt; ~/.profile
source ~/.profile
# 最后这一句，原作的原话如下:
# “儲存環境變數到~/.profile，告訴程式全數使用X渲染。如果你不這樣做，在X伺服器視窗開的Linux程式可能會跑到視窗外面。”
</code></pre></div></div>

<h2 id="注意-1">注意</h2>
<p>如果安装过程中，出现无法安装，有可能是因为apt较低或相关依赖库版本较低，可先尝试以下语句：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt update
sudo apt upgrade
</code></pre></div></div>

<h1 id="启动x-server">启动X Server</h1>
<p>执行下面语句启动 X Server</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># 设置窗口可以改变大小，至于1920x1080是我笔记本屏幕的大小，大家可以根据需求自行修改
Xephyr -br -ac -noreset -resizeable -screen 1920x1080 :1 &amp;
#上面这条命令最后的“&amp;”是指异步运行，这里需要异步运行后面还有命令需要输入
</code></pre></div></div>

<p>如果出现类似下面的提示信息</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Please change 1777 /tmp/.X11-unix.
</code></pre></div></div>

<p>可以执行以下语句：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># 解除文件挂在，避免出现权限无法修改的情况
sudo mount -o remount,rw /tmp/.X11-unix
# 调整文件夹权限
sudo chmod 1777 /tmp/.X11-unix
</code></pre></div></div>

<h1 id="启动桌面">启动桌面</h1>
<p>执行下面的语句需要启动桌面:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>export DISPLAY=:1
dbus-launch --exit-with-session startplasma-x11 &amp;
</code></pre></div></div>

<p>需要注意，桌面的显示依托于 <code class="language-plaintext highlighter-rouge">X Server</code>，所以必须在 <code class="language-plaintext highlighter-rouge">X Server</code> 启动后，才能正常启动桌面。</p>]]></content><author><name>Danny Xu</name></author><category term="WSL," /><category term="Linux," /><category term="kubuntu" /><summary type="html"><![CDATA[前言 手头的工作是需要做一下linux移植工作，突然想到以前总是用虚拟机安装Linux，从来没有尝试过WSL。 那就着手试试吧！ 安装 wsl 我这里简单写了，一般也可以顺利的安装。 详细的过程，可以参考文章WSL2安装和基本命令 先安装 wsl 工具 命令行中执行以下命令 wsl --install 安装后重启系统。 安装子系统 子系统有两种方式安装 命令行 # 查看可用linux版本 wsl --list --online # 安装指定的linux版本 wsl --install -d &lt;DistroName&gt; 商店安装 在 Windows Store 中，选择子系统安装。 注意 必须启用以下Windows功能 Hyper-V Virtual Machine Platform 适用于 Linux 的 Windows 子系统 安装桌面 我选用的是 KDE 版本的UBUNTU，参考了文章WSL2 Ubuntu22.04安装KDE桌面 安装命令 使用apt安装KDE桌面如下所示: # 可以安装kubuntu-desktop或plasma-desktop，区别是前者更完整体积更大后者提供基本的桌面组件体积更小 sudo apt install kubuntu-desktop 注意1 安装桌面过程中遇到如下提示: Initializing mlocate database; this may take some time 按照参考文章所说，这个过程其实是对配置中的目录进行全搜索，如果硬盘大会特别慢，2T据说要搜索6天。 这个时候不要急，我们可以调整搜索目录范围。 首先我们使用键盘快捷键 CTRL+Z，暂停桌面的安装进程（不用kill掉）。 你会看到进度条还在下方，但是此时可以输入命令了，输入如下命令： # 使用 VIM 工具打开文件 sudo vim /etc/updatedb.conf VIM工具进入后是命令状态，输入 I回车，进入编辑状态。 在 "PRUNEPATHS:" 变量后添加 "/mnt"。 编辑后，按ESC键返回命令状态，输入 :wq ，可以保存退出。 再次执行以下命令： # jobs命令用于查看当前执行的任务，按理说此时应该只有一个安装进程 jobs # fg命令用于返回之前暂停的任务，并继续执行，如果只有一个进程就正常输入 fg 执行fg命令后请等待，这时不会有屏幕刷新，但是后台其实正在执行，差不多1小时左右即可完成。 注意2 按照参考文章说，有人安装时候，需要执行下面的语句，但是我没遇到这个问题。 apt purge -y acpid acpi-support modemmanager apt-mark hold acpid acpi-support modemmanager 安装 X Server 安装xorg xorg是显示服务器，实现了 X Window 系统的功能，主要负责管理计算机的显示设备和用户输入设备（如键盘和鼠标）。 执行命令： sudo apt-get install xorg 安装Xehpyr Xephyr 是一个基于 KDrive 的嵌套 X Window，它允许在一个现有的 X Window 内部创建一个嵌套的 X Window，并在一个窗口中显示。 执行命令： sudo apt-get install xserver-xephyr 设置环境变量 执行命令： echo "export XDG_SESSION_TYPE=x11" &gt;&gt; ~/.profile echo "export GDK_PLATFORM=x11" &gt;&gt; ~/.profile echo "export GDK_BACKEND=x11" &gt;&gt; ~/.profile echo "export QT_QPA_PLATFORM=xcb" &gt;&gt; ~/.profile echo "export WAYLAND_DISPLAY=" &gt;&gt; ~/.profile source ~/.profile # 最后这一句，原作的原话如下: # “儲存環境變數到~/.profile，告訴程式全數使用X渲染。如果你不這樣做，在X伺服器視窗開的Linux程式可能會跑到視窗外面。” 注意 如果安装过程中，出现无法安装，有可能是因为apt较低或相关依赖库版本较低，可先尝试以下语句： sudo apt update sudo apt upgrade 启动X Server 执行下面语句启动 X Server # 设置窗口可以改变大小，至于1920x1080是我笔记本屏幕的大小，大家可以根据需求自行修改 Xephyr -br -ac -noreset -resizeable -screen 1920x1080 :1 &amp; #上面这条命令最后的“&amp;”是指异步运行，这里需要异步运行后面还有命令需要输入 如果出现类似下面的提示信息 Please change 1777 /tmp/.X11-unix. 可以执行以下语句： # 解除文件挂在，避免出现权限无法修改的情况 sudo mount -o remount,rw /tmp/.X11-unix # 调整文件夹权限 sudo chmod 1777 /tmp/.X11-unix 启动桌面 执行下面的语句需要启动桌面: export DISPLAY=:1 dbus-launch --exit-with-session startplasma-x11 &amp; 需要注意，桌面的显示依托于 X Server，所以必须在 X Server 启动后，才能正常启动桌面。]]></summary></entry><entry><title type="html">C++模板嵌套问题</title><link href="https://www.dannyxu.net/2024/06/27/CPlusPlus_template_Nesting.html" rel="alternate" type="text/html" title="C++模板嵌套问题" /><published>2024-06-27T00:00:00+08:00</published><updated>2024-06-27T00:00:00+08:00</updated><id>https://www.dannyxu.net/2024/06/27/CPlusPlus_template_Nesting</id><content type="html" xml:base="https://www.dannyxu.net/2024/06/27/CPlusPlus_template_Nesting.html"><![CDATA[<h1 id="前言">前言</h1>
<p>在编译一个项目的代码时，发生了编译错误<code class="language-plaintext highlighter-rouge">error C3878</code>，简化的代码如下：</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">Test</span><span class="p">()</span>
<span class="p">{</span>
	<span class="n">std</span><span class="o">::</span><span class="n">list</span><span class="o">&lt;</span><span class="n">T</span><span class="o">*&gt;::</span><span class="n">iterator</span> <span class="n">t</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h1 id="问题分析">问题分析</h1>

<p>上面的简化代码，看起来是没有问题的，即使用AI分析也不会有错误。</p>

<p>实际上上面这段代码在<code class="language-plaintext highlighter-rouge">VC140</code>及更早版本中是没问题的。</p>

<p>但是后续版本中，编译要求更严格了。</p>

<p>在<code class="language-plaintext highlighter-rouge">VC141</code>、<code class="language-plaintext highlighter-rouge">VC142</code>VC下编译，会得到两条错误，如下：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>error C2760: 语法错误: 意外的令牌“标识符”，预期的令牌为“;”
error C7510: “iterator”: 类型 从属名称的使用必须以“typename”为前缀
</code></pre></div></div>

<p>在<code class="language-plaintext highlighter-rouge">VC143</code>下编译，错误信息如下：</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>error C3878: syntax error: unexpected token 't' following 'expression'
</code></pre></div></div>

<p>从上面的信息差异可以看出，导致高版本编译错误的主要原因是<code class="language-plaintext highlighter-rouge">C++</code>标准的变动。</p>

<p>具体细则我暂时还没去查找，但大致可以推断是因为对模板的顶要求更严格了。</p>

<h1 id="解决方法">解决方法</h1>
<p>已经知道问题的原因了，参考<code class="language-plaintext highlighter-rouge">VC141</code>的错误信息，明确模板对象的嵌套关系，在嵌套的对象声明处加上typename即可。</p>

<p>修改后代码如下：</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">Test</span><span class="p">()</span>
<span class="p">{</span>
	<span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">list</span><span class="o">&lt;</span><span class="n">T</span><span class="o">*&gt;::</span><span class="n">iterator</span> <span class="n">t</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>Danny Xu</name></author><category term="C/C++" /><summary type="html"><![CDATA[前言 在编译一个项目的代码时，发生了编译错误error C3878，简化的代码如下： template&lt;typename T&gt; void Test() { std::list&lt;T*&gt;::iterator t; } 问题分析 上面的简化代码，看起来是没有问题的，即使用AI分析也不会有错误。 实际上上面这段代码在VC140及更早版本中是没问题的。 但是后续版本中，编译要求更严格了。 在VC141、VC142VC下编译，会得到两条错误，如下： error C2760: 语法错误: 意外的令牌“标识符”，预期的令牌为“;” error C7510: “iterator”: 类型 从属名称的使用必须以“typename”为前缀 在VC143下编译，错误信息如下： error C3878: syntax error: unexpected token 't' following 'expression' 从上面的信息差异可以看出，导致高版本编译错误的主要原因是C++标准的变动。 具体细则我暂时还没去查找，但大致可以推断是因为对模板的顶要求更严格了。 解决方法 已经知道问题的原因了，参考VC141的错误信息，明确模板对象的嵌套关系，在嵌套的对象声明处加上typename即可。 修改后代码如下： template&lt;typename T&gt; void Test() { typename std::list&lt;T*&gt;::iterator t; }]]></summary></entry><entry><title type="html">Azure DevOps 生成管道每次运行都会清理并重新获取所有代码</title><link href="https://www.dannyxu.net/2024/05/10/azure_devops_pipeline_delete_old_get_everytime.html" rel="alternate" type="text/html" title="Azure DevOps 生成管道每次运行都会清理并重新获取所有代码" /><published>2024-05-10T00:00:00+08:00</published><updated>2024-05-10T00:00:00+08:00</updated><id>https://www.dannyxu.net/2024/05/10/azure_devops_pipeline_delete_old_get_everytime</id><content type="html" xml:base="https://www.dannyxu.net/2024/05/10/azure_devops_pipeline_delete_old_get_everytime.html"><![CDATA[<h1 id="表现">表现</h1>
<p>Azure DevOps在生成管道时，总是清理掉旧的代码并重新获取。</p>

<h1 id="原因">原因</h1>
<p>这个问题已知的一种原因是由于Bug引起的。</p>

<p>当获取的源代码中，同时获取了<code class="language-plaintext highlighter-rouge">目标目录</code>和<code class="language-plaintext highlighter-rouge">目标目录/子目录</code>就会导致这个问题。</p>

<h1 id="解决方法">解决方法</h1>
<p>解决方法十分简单：依据自己要获取的内容，重新梳理代码映射设置，避免嵌套即可。</p>]]></content><author><name>Danny Xu</name></author><category term="Azure" /><category term="DevOps/TFS" /><summary type="html"><![CDATA[表现 Azure DevOps在生成管道时，总是清理掉旧的代码并重新获取。 原因 这个问题已知的一种原因是由于Bug引起的。 当获取的源代码中，同时获取了目标目录和目标目录/子目录就会导致这个问题。 解决方法 解决方法十分简单：依据自己要获取的内容，重新梳理代码映射设置，避免嵌套即可。]]></summary></entry><entry><title type="html">小心临时字符串std::string</title><link href="https://www.dannyxu.net/2024/05/10/becareful_temp_string.html" rel="alternate" type="text/html" title="小心临时字符串std::string" /><published>2024-05-10T00:00:00+08:00</published><updated>2024-05-10T00:00:00+08:00</updated><id>https://www.dannyxu.net/2024/05/10/becareful_temp_string</id><content type="html" xml:base="https://www.dannyxu.net/2024/05/10/becareful_temp_string.html"><![CDATA[<h1 id="前言">前言</h1>
<p>实际开发时发现有个地方函数执行的比较奇怪，例如：</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
    <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">str1</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="s">"A"</span><span class="p">).</span><span class="n">c_str</span><span class="p">();</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="mi">100</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">str2</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="s">"B"</span><span class="p">).</span><span class="n">c_str</span><span class="p">();</span>
        
        <span class="c1">// do something</span>
        <span class="c1">// str1 指向的值会变为 "B"</span>

    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h1 id="原因">原因</h1>
<p>发生这个问题的原因是表达式中的<code class="language-plaintext highlighter-rouge">std::string("A")</code>在当前行执行结束时就已经释放了。</p>

<p>变量str1虽然看起来有值，但实际上是指向了已经被释放的内存。</p>

<p>所以当再次有内存申请，这个地方的数据将会被覆盖。</p>

<h1 id="参考资料">参考资料</h1>
<p>这篇文章写的更细致些，我就不再复制了。<a href="https://blog.csdn.net/weixin_32101377/article/details/117145804">如何在c语言引用string,C++ 为什么在返回字符串的函数上调用std :: string.c_str()不起作用？</a></p>]]></content><author><name>Danny Xu</name></author><category term="C/C++" /><summary type="html"><![CDATA[前言 实际开发时发现有个地方函数执行的比较奇怪，例如： int main() { const char* str1 = std::string("A").c_str(); for(int i = 0 ;i &lt; 100; ++i) { const char* str2 = std::string("B").c_str(); // do something // str1 指向的值会变为 "B" } } 原因 发生这个问题的原因是表达式中的std::string("A")在当前行执行结束时就已经释放了。 变量str1虽然看起来有值，但实际上是指向了已经被释放的内存。 所以当再次有内存申请，这个地方的数据将会被覆盖。 参考资料 这篇文章写的更细致些，我就不再复制了。如何在c语言引用string,C++ 为什么在返回字符串的函数上调用std :: string.c_str()不起作用？]]></summary></entry><entry><title type="html">C++中静态变量的初始化与销毁</title><link href="https://www.dannyxu.net/2024/05/10/c++_static_var_init_and_destroy.html" rel="alternate" type="text/html" title="C++中静态变量的初始化与销毁" /><published>2024-05-10T00:00:00+08:00</published><updated>2024-05-10T00:00:00+08:00</updated><id>https://www.dannyxu.net/2024/05/10/c++_static_var_init_and_destroy</id><content type="html" xml:base="https://www.dannyxu.net/2024/05/10/c++_static_var_init_and_destroy.html"><![CDATA[<h1 id="前言">前言</h1>
<p>以下为规律总结，并未深入验证，暂时仅作参考。</p>

<h1 id="初始化时机">初始化时机</h1>

<p>静态变量的初始化通常是在使用到的时候进行的。</p>

<p>而这个初始化过程，有时候并不是如大家所想象的那么顺利。</p>

<p>假设存在<code class="language-plaintext highlighter-rouge">类A</code>的静态对象实例<code class="language-plaintext highlighter-rouge">A</code>，在其构造函数中使用<code class="language-plaintext highlighter-rouge">类B</code>的静态成员<code class="language-plaintext highlighter-rouge">B</code>进行初始化。会因为<code class="language-plaintext highlighter-rouge">B</code>并未先初始化而崩溃。</p>

<p>所以避免让静态对象的初始化依赖其他静态成员。</p>

<h1 id="销毁时机">销毁时机</h1>

<p>静态变量的销毁通常是随机的，可能会导致一些随机出现的错误。</p>

<p>假设存在<code class="language-plaintext highlighter-rouge">类A</code>的静态对象实例<code class="language-plaintext highlighter-rouge">A</code>，在其析构函数中调用了<code class="language-plaintext highlighter-rouge">类B</code>的静态成员<code class="language-plaintext highlighter-rouge">B</code>的接口，那么有可能会出现<code class="language-plaintext highlighter-rouge">B</code>已经被析构了，进而导致<code class="language-plaintext highlighter-rouge">A</code>的函数调用无效。</p>

<p>所以应避免在静态对象的析构函数中，调用其他静态对象的接口。</p>]]></content><author><name>Danny Xu</name></author><category term="C/C++" /><summary type="html"><![CDATA[前言 以下为规律总结，并未深入验证，暂时仅作参考。 初始化时机 静态变量的初始化通常是在使用到的时候进行的。 而这个初始化过程，有时候并不是如大家所想象的那么顺利。 假设存在类A的静态对象实例A，在其构造函数中使用类B的静态成员B进行初始化。会因为B并未先初始化而崩溃。 所以避免让静态对象的初始化依赖其他静态成员。 销毁时机 静态变量的销毁通常是随机的，可能会导致一些随机出现的错误。 假设存在类A的静态对象实例A，在其析构函数中调用了类B的静态成员B的接口，那么有可能会出现B已经被析构了，进而导致A的函数调用无效。 所以应避免在静态对象的析构函数中，调用其他静态对象的接口。]]></summary></entry></feed>