Compare commits

...

11 Commits

Author SHA1 Message Date
1e4d4395fc vcpkg记录 2026-03-30 17:02:48 +08:00
926dde47d8 Linux常用库。 2026-03-15 19:20:30 +08:00
ea79fc2496 Git删除Submodule。 2026-03-15 09:36:35 +08:00
859dac179c cpp编码. 2026-03-14 10:40:58 +08:00
f39caa9271 Win10取消睡眠添加。 2026-03-07 10:17:23 +08:00
b0c33cd57d SSO说明。 2026-03-06 14:31:59 +08:00
03b44c1345 noexcept说明。 2026-03-06 14:16:14 +08:00
267ab3e11a NRVO优化测试。 2026-03-06 14:08:15 +08:00
0b56988fcd xmake库使用不同toolset更新。 2026-03-06 11:45:09 +08:00
fdbb28d6c0 xmake库使用不同编译器更新。 2026-03-05 14:12:21 +08:00
bb519403e5 xmake库使用不同编译器。 2026-03-05 14:07:48 +08:00
8 changed files with 164 additions and 2 deletions

View File

@@ -0,0 +1,3 @@
常用库:
libsqlite3-dev nlohmann-json3-dev libgtest-dev ninja-build libboost-all-dev libfmt-dev
libfmt-dev libtinyxml2-dev

75
Languages/cpp/Vcpkg.txt Normal file
View File

@@ -0,0 +1,75 @@
常用库安装
curl[ssl,http2,http3,openssl,websockets,zstd,ssh,psl,idn2,brotli]
vcpkg.exe install boost:x64-mingw-dynamic --allow-unsupported
Please use the following command when you need to remove all boost ports/components:
vcpkg remove boost-uninstall:x64-mingw-dynamic --recurse"
x.安装
git clone https://github.com/microsoft/vcpkg
cd vcpkg
./bootstrap-vcpkg.bat (其他平台用对应的脚本)
x.如何更新
git pull
重新./bootstrap-vcpkg.bat
x.查询有哪些库 https://vcpkg.io/en/index.html
在 triplets/下面设置
.\vcpkg.exe install openssl --triplet x86-windows
--triplet 后面的内容就是triplets/下的列表
set(VCPKG_PLATFORM_TOOLSET v141)
有效设置
Visual Studio 2022 平台工具集为 v143。
Visual Studio 2019 平台工具集为 v142。
Visual Studio 2017 平台工具集为 v141。
Visual Studio 2015 平台工具集为 v140。
x.安装库
vcpkg install spdlog (默认x86)
vcpkg install spdlog:x64-windows
vcpkg install spdlog:x64-windows-static
x.更新库
vcpkg update 或者 vcpkg upgrade 列出
upgrade 会列出,但是不升级,使用 -no-dry-run
vcpkg upgrade spdlog:x64-windows --no-dry-run
可以指定多个库参数
x.查询库
vcpkg search spdlog
x.列出已安装的库
vcpkg list
x.导出一个库
vcpkg export spdlog:x64-windows --zip or --7zip
–raw 以不打包的目录格式导出
–nuget 以nuget包形式导出
–ifw 我也不知道这是啥格式
–zip 以zip压缩包形式导出
–7zip 以7z压缩包形式导出
x.到处所有已安装的库。
--x-all-installed
导出位置在 vcpkg 目录下
x.集成到 visual studio (全局)
vcpkg integrate install
vcpkg integrate remove
x.集成到 visual studio (某个项目)
vcpkg integrate project 生成 nuget 配置文件,同时会给一个安装命令。
在 vs 中打开[工具]->nuget->控制台,输入安装命令。
x.集成到 CMake
设置 CMAKE_TOOLCHAIN_FILE {vcpkg_root}/scripts/buildsystems/vcpkg.cmake
x.例如 VSCode 编辑器
settings.json中:
"cmake.configureSettings": {
"CMAKE_TOOLCHAIN_FILE": "${env:VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
},

View File

@@ -0,0 +1,29 @@
下面的讨论都是讨论Windows下的,因为其他平台基本都是默认U8,且支持OK。
测试情况如下:
// 编译选项:/std:c++17 /utf-8
int main() {
#if _WIN32 // 热知识:64 位 Windows 也会定义 _WIN32 宏,所以 _WIN32 可以用于检测是否是 Windows 系统
setlocale(LC_ALL, ".utf-8"); // 设置标准库调用系统 API 所用的编码,用于 fopen,ifstream 等函数
SetConsoleOutputCP(CP_UTF8); // 设置控制台输出编码,或者写 system("chcp 65001") 也行,这里 CP_UTF8 = 65001
SetConsoleCP(CP_UTF8); // 设置控制台输入编码,用于 std::cin
#elif __APPLE__
// 通常来说 MacOS 的默认编码就是 UTF-8,这里设置全局 locale 是为了让 iswspace 接受全角空格、iswpunct 接受全角逗号 L',' 等
setlocale(LC_ALL, "UTF-8"); // MacOS 设置 UTF-8 编码,让 iswspace 接受全角空格等
#elif __unix__
// 反正 Unix 系统默认都是 UTF-8,不设置也行,这里设置全局 locale 是为了让 iswspace 接受全角空格、iswpunct 接受全角逗号 L',' 等
//setlocale(LC_ALL, "zh_CN.utf-8"); // 设置使用中文本地化,可使 strerror 输出中文(但用户必须 locale-gen 过中文!)
setlocale(LC_ALL, "C.utf-8"); // 设置使用语言中性 locale(推荐),只影响 iswspace、iswpunct 等函数,不会使 strerror 等输出中文
#endif
// 这里开始写你的主程序吧!
// ...
std::cout << "你好,世界\n"; // 没问题!
std::ifstream fin("你好.txt"); // 没问题!
std::wcout << L"你好,世界\n"; // 你都统一 UTF-8 了,这破 UTF-16 和 UTF-32 之间来回跳的破 wchar_t 就别用了呗!
return 0;
}
这种方式其实基本就已经实现了全UTF-8的情况,但是有一个前提条件就是控制台支持UTF-8的读入,输出不清楚,
可能也有不少控制台支持输出U8,但支持UTF-8读入的好像不多,目前测试比较好的就是Windows Terminal。
不支持UTF-8输入的控制台,就只能用ReadConsoleW去自行封装解码,鉴于不够通用,没有深入研究。

View File

@@ -0,0 +1,12 @@
【1】函数直接返回一个栈上面的对象,是会调用移动构造还是复制构造??
实际测试=>
(1)在MSVC中,不开优化时调用移动构造,开启优化时,编译器直接在返回值位置构造对象,避免拷贝/移动。
称为NRVO优化 [NRVO​ 是 Named Return Value Optimization​ 的缩写,意思是 "命名返回值优化"。]。因为在函数中,返回的是一个有名字的局部变量。
【2】noexcept干嘛的?
用于优化。
很多标准库容器(如 std::vector)操作在重新分配内存时,会根据移动操作的 noexcept决定策略。
即检查移动操作是否是 noexcept来选择"移动还是拷贝"。
比如std::vector<ClassA>,在扩容时,默认调用ClassA的拷贝构造函数,因为假如默认移动构造,移动到某个位置突然异常了,这时候没法“复原”数据,
因为移动,原容器不能用了,又因为没有移动完,移动后的也不能用,只能终止。但用户意愿可能需要可以恢复,所以默认不调用移动构造。
如果用户明确表明了noexcept,那么表示可以接受如果移动失败终止的结果。

View File

@@ -0,0 +1,4 @@
【1】SSO(Small String Optimization)小字符串优化。
std::string在很多实现中使用了 SSO:
短字符串(通常<=15字符)直接存储在对象内部,不堆分配
长字符串才使用堆内存,使用std::move后,可能地址不同。

View File

@@ -1,2 +1,7 @@
【1】删除远程分支:
git push origin --delete dev
【2】删除submodule示例
git submodule deinit googletest
git rm googletest
git commit -m "Remove googletest"

View File

@@ -22,3 +22,22 @@ target("zoost-use")
set_kind("binary")
add_files("src/*.cpp")
add_packages("zoost")
【1.1 如果当前环境有多个编译器,比如2个vs版本】
可以尝试使用:
xrepo install -p windows --vs=2017 --toolchain=msvc zoost
xrepo install -p windows --vs=2022 --toolchain=msvc zoost
这种来指定不同的库版本。当然工程中也需要指定如xmake f --vs=2022 --toolchain=msvc来对应。
后续使用发现,指定了--vs=2022 --toolchain=msvc应该会自适应编译器版本,但是--toolchain=msvc
必须要设定,不能光设定--vs=2022。
--比如当在vs2022中安装了v141工具集时,xmake使用
xmake -f --vs_toolset=14.16,而不是v141这种写法。
【2】xmake的基本配置
-c 表示清除之前的缓存。
--toolchain=msvc 一般使用vs的时候最好也指定,不然有时候某些功能不生效。
1,配置debug,xmake f -m debug
2,指定vs2017,xmake f --vs=2017 --toolchain=msvc
3,重新构建,xmake --rebuild

View File

@@ -0,0 +1,15 @@
https://help.realvnc.com/hc/en-us/articles/28401208368413-Resolving-the-Sleep-is-enabled-warning-in-RealVNC-Server
powercfg /query SCHEME_CURRENT SUB_SLEEP
这个命令会查询并显示你当前活跃电源方案的所有与睡眠相关的电源设置,而不仅仅是某个特定设置。
要更改设置以禁用任何睡眠命令,请在PowerShell窗口中运行以下作。
# Disable all timeouts for maximum "always on" configuration
powercfg /change standby-timeout-ac 0
powercfg /change standby-timeout-dc 0
powercfg /change monitor-timeout-ac 0
powercfg /change monitor-timeout-dc 0
powercfg /change disk-timeout-ac 0
powercfg /change disk-timeout-dc 0
powercfg /change hibernate-timeout-ac 0
powercfg /change hibernate-timeout-dc 0