Files
reference/docs/cmake.html
2022-11-17 08:00:19 +00:00

190 lines
23 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" data-color-mode="dark">
<head>
<meta charset="utf-8">
<title>CMake 备忘清单
&#x26; cmake cheatsheet &#x26; Quick Reference</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta description="本清单提供了对 CMake 的入门简要概述,以及 CMake 常用示例为开发人员分享快速参考备忘单。">
<meta keywords="Quick,Reference,cheatsheet,cmake">
<link rel="icon" href="data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%221em%22%20width%3D%221em%22%3E%20%3Cpath%20d%3D%22m21.66%2010.44-.98%204.18c-.84%203.61-2.5%205.07-5.62%204.77-.5-.04-1.04-.13-1.62-.27l-1.68-.4c-4.17-.99-5.46-3.05-4.48-7.23l.98-4.19c.2-.85.44-1.59.74-2.2%201.17-2.42%203.16-3.07%206.5-2.28l1.67.39c4.19.98%205.47%203.05%204.49%207.23Z%22%20fill%3D%22%23c9d1d9%22%2F%3E%20%3Cpath%20d%3D%22M15.06%2019.39c-.62.42-1.4.77-2.35%201.08l-1.58.52c-3.97%201.28-6.06.21-7.35-3.76L2.5%2013.28c-1.28-3.97-.22-6.07%203.75-7.35l1.58-.52c.41-.13.8-.24%201.17-.31-.3.61-.54%201.35-.74%202.2l-.98%204.19c-.98%204.18.31%206.24%204.48%207.23l1.68.4c.58.14%201.12.23%201.62.27Zm2.43-8.88c-.06%200-.12-.01-.19-.02l-4.85-1.23a.75.75%200%200%201%20.37-1.45l4.85%201.23a.748.748%200%200%201-.18%201.47Z%22%20fill%3D%22%23228e6c%22%20%2F%3E%20%3Cpath%20d%3D%22M14.56%2013.89c-.06%200-.12-.01-.19-.02l-2.91-.74a.75.75%200%200%201%20.37-1.45l2.91.74c.4.1.64.51.54.91-.08.34-.38.56-.72.56Z%22%20fill%3D%22%23228e6c%22%20%2F%3E%20%3C%2Fsvg%3E" type="image/svg+xml">
<link rel="stylesheet" href="../style/style.css">
<link rel="stylesheet" href="../style/katex.css">
</head>
<body><nav class="header-nav"><div class="max-container"><a href="../index.html" class="logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" height="1em" width="1em">
<path d="m21.66 10.44-.98 4.18c-.84 3.61-2.5 5.07-5.62 4.77-.5-.04-1.04-.13-1.62-.27l-1.68-.4c-4.17-.99-5.46-3.05-4.48-7.23l.98-4.19c.2-.85.44-1.59.74-2.2 1.17-2.42 3.16-3.07 6.5-2.28l1.67.39c4.19.98 5.47 3.05 4.49 7.23Z" fill="#c9d1d9"></path>
<path d="M15.06 19.39c-.62.42-1.4.77-2.35 1.08l-1.58.52c-3.97 1.28-6.06.21-7.35-3.76L2.5 13.28c-1.28-3.97-.22-6.07 3.75-7.35l1.58-.52c.41-.13.8-.24 1.17-.31-.3.61-.54 1.35-.74 2.2l-.98 4.19c-.98 4.18.31 6.24 4.48 7.23l1.68.4c.58.14 1.12.23 1.62.27Zm2.43-8.88c-.06 0-.12-.01-.19-.02l-4.85-1.23a.75.75 0 0 1 .37-1.45l4.85 1.23a.748.748 0 0 1-.18 1.47Z" fill="#228e6c"></path>
<path d="M14.56 13.89c-.06 0-.12-.01-.19-.02l-2.91-.74a.75.75 0 0 1 .37-1.45l2.91.74c.4.1.64.51.54.91-.08.34-.38.56-.72.56Z" fill="#228e6c"></path>
</svg>
<span class="title">Quick Reference</span></a><div class="menu"><a href="https://github.com/jaywcjlove/reference/blob/main/docs/cmake.md" class="" target="__blank"><svg viewBox="0 0 36 36" fill="currentColor" height="1em" width="1em"><path d="m33 6.4-3.7-3.7a1.71 1.71 0 0 0-2.36 0L23.65 6H6a2 2 0 0 0-2 2v22a2 2 0 0 0 2 2h22a2 2 0 0 0 2-2V11.76l3-3a1.67 1.67 0 0 0 0-2.36ZM18.83 20.13l-4.19.93 1-4.15 9.55-9.57 3.23 3.23ZM29.5 9.43 26.27 6.2l1.85-1.85 3.23 3.23Z"></path><path fill="none" d="M0 0h36v36H0z"></path></svg><span>编辑</span></a><button id="darkMode" type="button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="light" height="1em" width="1em">
<path d="M6.995 12c0 2.761 2.246 5.007 5.007 5.007s5.007-2.246 5.007-5.007-2.246-5.007-5.007-5.007S6.995 9.239 6.995 12zM11 19h2v3h-2zm0-17h2v3h-2zm-9 9h3v2H2zm17 0h3v2h-3zM5.637 19.778l-1.414-1.414 2.121-2.121 1.414 1.414zM16.242 6.344l2.122-2.122 1.414 1.414-2.122 2.122zM6.344 7.759 4.223 5.637l1.415-1.414 2.12 2.122zm13.434 10.605-1.414 1.414-2.122-2.122 1.414-1.414z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" class="dark" height="1em" width="1em">
<path d="M12 11.807A9.002 9.002 0 0 1 10.049 2a9.942 9.942 0 0 0-5.12 2.735c-3.905 3.905-3.905 10.237 0 14.142 3.906 3.906 10.237 3.905 14.143 0a9.946 9.946 0 0 0 2.735-5.119A9.003 9.003 0 0 1 12 11.807z"></path>
</svg>
</button><script>
const LOCAL_NANE = '_dark_mode_theme_'
const rememberedValue = localStorage.getItem(LOCAL_NANE);
if (rememberedValue && ['light', 'dark'].includes(rememberedValue)) {
document.documentElement.setAttribute('data-color-mode', rememberedValue);
}
const button = document.querySelector('#darkMode');
button.onclick = () => {
const theme = document.documentElement.dataset.colorMode;
const mode = theme === 'light' ? 'dark' : 'light';
document.documentElement.setAttribute('data-color-mode', mode);
localStorage.setItem(LOCAL_NANE, mode);
}
</script><a href="https://github.com/jaywcjlove/reference" class="" target="__blank"><svg viewBox="0 0 16 16" fill="currentColor" height="1em" width="1em"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg></a></div></div></nav><div class="wrap h1body-exist max-container"><header class="wrap-header h1wrap"><h1 id="cmake-备忘清单"><svg viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg" height="1em" width="1em">
<path d="M11.769.066.067 23.206l12.76-10.843zm11.438 23.868L7.471 17.587 0 23.934zm.793-.198L12.298.463l1.719 19.24zM12.893 12.959l-5.025 4.298 5.62 2.248z"></path>
</svg>
<a aria-hidden="true" tabindex="-1" href="#cmake-备忘清单"><span class="icon icon-link"></span></a>CMake 备忘清单</h1><div class="wrap-body">
<p>本清单提供了对 CMake 的入门简要概述,以及 CMake 常用示例</p>
</div></header><div class="menu-tocs"><div class="menu-btn"><svg aria-hidden="true" fill="currentColor" height="1em" width="1em" viewBox="0 0 16 16" version="1.1" data-view-component="true">
<path fill-rule="evenodd" d="M2 4a1 1 0 100-2 1 1 0 000 2zm3.75-1.5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zM3 8a1 1 0 11-2 0 1 1 0 012 0zm-1 6a1 1 0 100-2 1 1 0 000 2z"></path>
</svg></div><div class="menu-modal"><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#入门">入门</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#hello-cmake">Hello CMake</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#cmakeliststxt">CMakeLists.txt</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#maincpp">main.cpp</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#编译示例">编译示例</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#cmake">cmake</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#常用参数">常用参数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#另见">另见</a></div></div><div class="h1wrap-body"><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="入门"><a aria-hidden="true" tabindex="-1" href="#入门"><span class="icon icon-link"></span></a>入门</h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-exist"><div class="wrap-header h3wrap"><h3 id="hello-cmake"><a aria-hidden="true" tabindex="-1" href="#hello-cmake"><span class="icon icon-link"></span></a>Hello CMake</h3><div class="wrap-body">
<p>CMake 是一个用于配置跨平台源代码项目应该如何配置的工具建立在给定的平台上。</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">├── CMakeLists.txt <span class="token comment"># 希望运行的 CMake命令</span>
</span><span class="code-line">├── main.cpp <span class="token comment"># 带有main 的源文件</span>
</span><span class="code-line">├── include <span class="token comment"># 头文件目录</span>
</span><span class="code-line">│   └── header.h
</span><span class="code-line">└── src <span class="token comment"># 源代码目录</span>
</span><span class="code-line"> ├── a.c
</span><span class="code-line"> └── b.c
</span></code></pre>
<p>在此项目上运行 <code>CMake</code> 时,系统会要求您提供二进制目录,运行 <code>CMake</code> 不会创建最终的可执行文件,而是会为 <code>Visual Studio</code><code>XCode</code><code>makefile</code> 生成项目文件。 使用这些工具构建该项目</p>
<h4 id="cmakeliststxt"><a aria-hidden="true" tabindex="-1" href="#cmakeliststxt"><span class="icon icon-link"></span></a>CMakeLists.txt</h4>
<pre class="language-cmake"><code class="language-cmake code-highlight"><span class="code-line"><span class="token comment"># 设置可以使用的最低 CMake 版本</span>
</span><span class="code-line"><span class="token keyword">cmake_minimum_required</span><span class="token punctuation">(</span><span class="token property">VERSION</span> <span class="token number">3.5</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token comment"># 设置项目名称</span>
</span><span class="code-line"><span class="token keyword">project</span> <span class="token punctuation">(</span>hello_cmake<span class="token punctuation">)</span>
</span><span class="code-line"><span class="token comment"># 添加可执行文件</span>
</span><span class="code-line"><span class="token keyword">add_executable</span><span class="token punctuation">(</span>hello_cmake main.cpp<span class="token punctuation">)</span>
</span><span class="code-line"><span class="token comment"># 添加头文件目录</span>
</span><span class="code-line"><span class="token keyword">target_include_directories</span><span class="token punctuation">(</span>hello_cmake <span class="token namespace">PRIVATE</span> ./include<span class="token punctuation">)</span>
</span><span class="code-line"><span class="token comment"># 批量添加源文件</span>
</span><span class="code-line"><span class="token keyword">file</span><span class="token punctuation">(</span>GLOB SRCS CONFIGURE_DEPENDS ./src/*.cpp<span class="token punctuation">)</span>
</span><span class="code-line"><span class="token keyword">target_sources</span><span class="token punctuation">(</span>hello_cmake <span class="token namespace">PUBLIC</span> <span class="token punctuation">${</span>SRCS<span class="token punctuation">}</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token comment"># 添加第三方库</span>
</span><span class="code-line"><span class="token keyword">find_package</span><span class="token punctuation">(</span>OpenGL CONFIG REQUIRED<span class="token punctuation">)</span>
</span><span class="code-line"><span class="token comment"># 链接第三方库</span>
</span><span class="code-line"><span class="token keyword">target_link_libraries</span><span class="token punctuation">(</span>hello_cmake <span class="token namespace">PRIVATE</span> OpenGL<span class="token punctuation">)</span>
</span><span class="code-line"><span class="token comment"># 指定输出路径</span>
</span><span class="code-line"><span class="token keyword">set_property</span><span class="token punctuation">(</span>TARGET hello_cmake <span class="token punctuation">${</span><span class="token variable">CMAKE_SOURCE_DIR</span><span class="token punctuation">}</span>/bin<span class="token punctuation">)</span>
</span><span class="code-line">
</span></code></pre>
<h4 id="maincpp"><a aria-hidden="true" tabindex="-1" href="#maincpp"><span class="icon icon-link"></span></a>main.cpp</h4>
<pre class="language-c"><code class="language-c code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;iostream></span></span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>argv<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token operator">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Hello CMake!"</span> <span class="token operator">&#x3C;&#x3C;</span> std<span class="token operator">::</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<h4 id="编译示例"><a aria-hidden="true" tabindex="-1" href="#编译示例"><span class="icon icon-link"></span></a>编译示例</h4>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">$ <span class="token function">mkdir</span> build <span class="token comment"># 创建 build 目录</span>
</span><span class="code-line">$ <span class="token builtin class-name">cd</span> build <span class="token comment"># 进入目录</span>
</span><span class="code-line">$ cmake <span class="token punctuation">..</span> <span class="token comment"># 目录的上一级目录运行命令</span>
</span><span class="code-line">$ <span class="token function">make</span> <span class="token comment"># 使用对应的编译工具</span>
</span><span class="code-line">$ ./hello_cmake <span class="token comment"># 运行生成的 hello_cmake</span>
</span><span class="code-line">Hello CMake<span class="token operator">!</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-exist col-span-2"><div class="wrap-header h3wrap"><h3 id="cmake"><a aria-hidden="true" tabindex="-1" href="#cmake"><span class="icon icon-link"></span></a>cmake</h3><div class="wrap-body">
<!--rehype:wrap-class=col-span-2-->
<p>生成项目构建系统</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">$ cmake <span class="token punctuation">[</span><span class="token operator">&#x3C;</span>options<span class="token operator">></span><span class="token punctuation">]</span> <span class="token operator">&#x3C;</span>path-to-source <span class="token operator">|</span> path-to-existing-build<span class="token operator">></span>bash
</span><span class="code-line">$ cmake <span class="token punctuation">[</span><span class="token operator">&#x3C;</span>options<span class="token operator">></span><span class="token punctuation">]</span> <span class="token parameter variable">-S</span> <span class="token operator">&#x3C;</span>path-to-source<span class="token operator">></span> <span class="token parameter variable">-B</span> <span class="token operator">&#x3C;</span>path-to-build<span class="token operator">></span>
</span></code></pre>
<p>建立一个项目</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">$ cmake <span class="token parameter variable">--build</span> <span class="token operator">&#x3C;</span>dir<span class="token operator">></span> <span class="token punctuation">[</span><span class="token operator">&#x3C;</span>options<span class="token operator">></span><span class="token punctuation">]</span> <span class="token punctuation">[</span>-- <span class="token operator">&#x3C;</span>build-tool-options<span class="token operator">></span><span class="token punctuation">]</span>
</span></code></pre>
<p>安装项目</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">$ cmake <span class="token parameter variable">--install</span> <span class="token operator">&#x3C;</span>dir<span class="token operator">></span> <span class="token punctuation">[</span><span class="token operator">&#x3C;</span>options<span class="token operator">></span><span class="token punctuation">]</span>
</span></code></pre>
<p>运行指定项目</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">cmake <span class="token parameter variable">--build</span> <span class="token operator">&#x3C;</span>dir<span class="token operator">></span> <span class="token parameter variable">--target</span> <span class="token operator">&#x3C;</span>project<span class="token operator">></span>
</span></code></pre>
<p>打开一个项目</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">$ cmake <span class="token parameter variable">--open</span> <span class="token operator">&#x3C;</span>dir<span class="token operator">></span>
</span></code></pre>
<p>运行脚本</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">$ cmake <span class="token punctuation">[</span>-D <span class="token operator">&#x3C;</span>var<span class="token operator">>=</span><span class="token operator">&#x3C;</span>value<span class="token operator">></span><span class="token punctuation">]</span><span class="token punctuation">..</span>. <span class="token parameter variable">-P</span> <span class="token operator">&#x3C;</span>cmake-script-file<span class="token operator">></span>
</span></code></pre>
<p>运行命令行工具</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">$ cmake <span class="token parameter variable">-E</span> <span class="token operator">&#x3C;</span>command<span class="token operator">></span> <span class="token punctuation">[</span><span class="token operator">&#x3C;</span>options<span class="token operator">></span><span class="token punctuation">]</span>
</span></code></pre>
<p>运行查找包工具</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">$ cmake --find-package <span class="token punctuation">[</span><span class="token operator">&#x3C;</span>options<span class="token operator">></span><span class="token punctuation">]</span>
</span></code></pre>
<p>运行工作流预设</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">$ cmake <span class="token parameter variable">--workflow</span> <span class="token punctuation">[</span><span class="token operator">&#x3C;</span>options<span class="token operator">></span><span class="token punctuation">]</span>
</span></code></pre>
<p>查看帮助</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">$ cmake --help<span class="token punctuation">[</span>-<span class="token operator">&#x3C;</span>topic<span class="token operator">></span><span class="token punctuation">]</span>
</span></code></pre>
<h4 id="常用参数"><a aria-hidden="true" tabindex="-1" href="#常用参数"><span class="icon icon-link"></span></a>常用参数</h4>
<ul>
<li>方式一: 在<code>CMakeLists.txt</code>中使用<code>set(KEY VAL)</code>函数</li>
<li>方式二: 在执行<code>cmake ...</code> -D<arg> 指定(只需一次,推荐)</arg></li>
</ul>
<pre class="language-cmake"><code class="language-cmake code-highlight"><span class="code-line"><span class="token comment"># 指定编译参数(Debug/Release/MinSizeRel/RelWithDebInfo)</span>
</span><span class="code-line">$ cmake ... -D <span class="token variable">CMAKE_BUILD_TYPE</span>=DEBUG
</span><span class="code-line"><span class="token comment"># 指定编译链工具(windows下vcpkg需要)</span>
</span><span class="code-line">$ cmake ... -D <span class="token variable">CMAKE_TOOLCHAIN_FILE</span>=&#x3C;vcpkg_path<span class="token punctuation">></span>/scripts/buildsystems/vcpkg.cmake
</span><span class="code-line"><span class="token comment"># 指定编译器</span>
</span><span class="code-line">$ cmake ... -D CAMKE_C_COMPILER=...
</span><span class="code-line">$ cmake ... -D CAMKE_CXX_COMPILER=...
</span><span class="code-line"><span class="token comment"># 指定生成器</span>
</span><span class="code-line">$ cmake .. -G <span class="token string">"Unix Makefile"</span>
</span><span class="code-line">$ cmake .. -G <span class="token string">"Ninja"</span>
</span><span class="code-line">$ cmake .. -G <span class="token string">"Visual Studio 17 2022"</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment"># 设置Cpp标准</span>
</span><span class="code-line"><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token variable">CMAKE_CXX_STANDARD</span> <span class="token number">17</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token variable">CMAKE_CXX_STANDARD_REQUIRED</span> <span class="token boolean">ON</span><span class="token punctuation">)</span> <span class="token comment"># 在检测到不支持时出错</span>
</span><span class="code-line"><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token variable">CMAKE_CXX_EXTENSIONS</span> <span class="token boolean">ON</span><span class="token punctuation">)</span> <span class="token comment">#一般设为off否则在msvc上没有特性会出错</span>
</span></code></pre>
</div></div></div></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="另见"><a aria-hidden="true" tabindex="-1" href="#另见"><span class="icon icon-link"></span></a>另见</h2><div class="wrap-body">
<ul>
<li><a href="http://ttroy50.github.io/cmake-examples/">CMake Examples</a> <em>(ttroy50.github.io)</em></li>
</ul>
</div></div><div class="h2wrap-body"></div></div></div></div><footer class="footer-wrap"><footer class="max-container">© 2022 Kenny Wang.</footer></footer><script>
if(('onhashchange' in window) && ((typeof document.documentMode==='undefined') || document.documentMode==8)) {
window.onhashchange = function () {
anchorPoint()
updateAnchor()
};
}
function anchorPoint() {
const hash = window.location.hash?.replace(/^#/, '') || '';
const elm = document.getElementById(decodeURIComponent(hash));
Array.from(document.querySelectorAll('.h2wrap-body .wrap')).forEach((elm) => elm.classList.remove('active'))
if (elm?.tagName === 'H3') {
elm?.parentElement?.parentElement?.classList.add('active');
}
}
anchorPoint();
function updateAnchor(element) {
const anchorContainer = document.querySelectorAll('.menu-tocs .menu-modal a.tocs-link');
anchorContainer.forEach((tocanchor) => {
tocanchor.classList.remove('is-active-link');
});
const anchor = element || document.querySelector(`a.tocs-link[href='${decodeURIComponent(window.location.hash)}']`);
if (anchor) {
anchor.classList.add('is-active-link');
}
}
// toc 定位
updateAnchor()
const anchor = document.querySelectorAll('.menu-tocs .menu-modal a.tocs-link');
anchor.forEach((item) => {
item.addEventListener('click', (e) => {
updateAnchor()
})
})
</script></body>
</html>