{
  "version": "https://jsonfeed.org/version/1", 
  "title": "C++", 
  "description": "\u5173\u4e8e\u7f16\u7a0b\u8bed\u8a00 C++ \u7684\u4f7f\u7528\u8ba8\u8bba", 
  "home_page_url": "https://www.v2ex.com/go/cpp", 
  "feed_url": "https://www.v2ex.com/feed/cpp.json", 
  "icon": "https://cdn.v2ex.com/navatar/6c34/0f25/1063_large.png?m=1645243654", 
  "favicon": "https://cdn.v2ex.com/navatar/6c34/0f25/1063_normal.png?m=1645243654", 
  "items": [
    {
      "author": {
        "url": "https://www.v2ex.com/member/jim9606", 
        "name": "jim9606", 
        "avatar": "https://cdn.v2ex.com/avatar/55a1/b599/317645_large.png?m=1775672289"
      }, 
      "url": "https://www.v2ex.com/t/1204467", 
      "title": "\u4f3c\u4e4e\u5728 C \u7684\u9886\u57df\uff0c\u8ba9\u4e00\u4e2a\u65b0\u7a0b\u5e8f\u201c\u4e3a\u672a\u6765\u51c6\u5907\u597d\u201d\u662f\u4e00\u4ef6\u5f88\u9ebb\u70e6\u7684\u4e8b", 
      "id": "https://www.v2ex.com/t/1204467", 
      "date_published": "2026-04-08T18:34:30+00:00", 
      "content_html": "<p>\u6700\u8fd1\u5728\u4fee\u6539\u4e00\u4e2a C \u7684\u5f00\u6e90\u5c0f\u9879\u76ee\u3002\u56e0\u4e3a\u662f\u60f3\u5728 Win \u4e0b\u7528\u7684\uff0c\u4f46\u9879\u76ee\u662f\u7528 autoconf \u6784\u5efa\u7684\uff0c\u6240\u4ee5\u51c6\u5907\u4e86 MSYS2 UCRT64 \u73af\u5883\u6765\u5f00\u53d1\u3002\u7136\u540e\u5c31\u8e29\u4e86\u5904\u7406\u4e0d\u4e86\u5927\u4e8e 2G \u6587\u4ef6\u7684\u5751(\u7528\u4e86 fstat)\u3002\u867d\u7136\u8bf4\u5c31\u662f\u4e00\u4e2a _FILE_OFFSET_BITS \u5b8f\u7684\u4e8b\uff0c\u4f46\u6bd5\u7adf\u662f\u4e2a\u8de8\u5e73\u53f0\u9879\u76ee\uff0c\u6240\u4ee5\u5c31\u67e5\u4e86\u4e0b\u4e3b\u6d41\u7cfb\u7edf\u4e0b\u8fd9\u4e2a\u95ee\u9898\u7684\u652f\u6301\u60c5\u51b5\uff0c\u611f\u89c9\u597d\u591a\u69fd\u70b9\u3002</p>\n<ol>\n<li>MSYS MinGW-w64 \u9ed8\u8ba4\u63d0\u4f9b 32 \u4f4d off_t \uff0c\u54ea\u6015\u4f60\u5728\u7f16\u8bd1 64 \u4f4d\u7a0b\u5e8f\uff0c\u60f3\u7528\u9700\u8981\u4e0a\u9762\u7684\u5b8f\uff0c\u4f46\u8fd9\u5e76\u4e0d\u662f POSIX \u6807\u51c6\u5316\u7684\u4e1c\u897f</li>\n<li>autoconf \u6709\u4e00\u4e2a AC_SYS_LARGEFILE \u53ef\u4ee5\u81ea\u52a8\u5224\u65ad\u662f\u5426\u9700\u8981\u5b9a\u4e49\u5b8f\uff0c\u4f46 autoscan \u6ca1\u63d0\u793a\u9700\u8981\u8fd9\u4e2a</li>\n<li>\u5982\u679c\u662f 32 \u4f4d target \uff0c\u4f3c\u4e4e\u9ed8\u8ba4\u63d0\u4f9b 32 \u4f4d off_t \u662f\u5929\u7ecf\u5730\u4e49\u7684</li>\n<li>\u4e0d\u60f3\u8ddf\u73af\u5883\u6253\u54d1\u8c1c\u7684\u53ef\u4ee5\u7528\u660e\u786e 64 \u4f4d\u7684\u65b9\u6cd5\uff0c\u4f8b\u5982 fseeko64 fstat64 \uff0c\u4f46\u8fd9\u73a9\u610f\u5e76\u4e0d\u666e\u904d\u53ef\u7528\uff0c\u8fd8\u662f\u8981\u6784\u5efa\u7cfb\u7edf\u68c0\u6d4b\u3002 \u4f8b\u5982\u8001\u7248\u672c android \u5c31\u4e0d\u652f\u6301\u3002bionic \u7684\u6587\u6863\u8bf4\u4e00\u5927\u5806\u8003\u91cf\uff0c\u7ed3\u679c\u5c31\u662f\u60f3\u89e3\u51b3\u4f60\u5f97\u7528\u8f83\u65b0\u7684 ndk \uff0c\u653e\u5f03\u652f\u6301\u65e7\u7248 android \uff0c\u6216\u8005\u5c31\u653e\u5f03\u652f\u6301 32 \u4f4d abi \u3002\uff08\u6240\u4ee5\u5b9e\u9645\u4e0a\u54ea\u6015\u662f arm64-v8a \u7684 android \u7cfb\u7edf\u4f9d\u7136\u6709\u673a\u4f1a\u5728\u5904\u7406\u5927\u6587\u4ef6\u65f6\u51fa\u95ee\u9898\uff09</li>\n<li>\u54ea\u6015\u4f60\u4e0d\u5173\u5fc3\u6587\u4ef6\u5927\u5c0f\u4e5f\u53ef\u80fd\u88ab\u5f71\u54cd\uff0c\u4f8b\u5982\u67e5\u4e2a\u6587\u4ef6\u521b\u5efa\u65e5\u671f\u5c31\u8981\u7528\u5230 fstat \uff0c\u5c3d\u7ba1\u89c9\u5f97\u505a\u7684\u4e8b\u8ddf\u5927\u5c0f\u65e0\u5173\u4f46\u5c31\u662f\u6709\u5f71\u54cd</li>\n<li>\u5982\u679c\u5728 abi \u8fb9\u754c\u7528\u4e86\u8fd9\u4e9b\u5e26 off_t \u7684\u53d8\u91cf/struct \uff0c\u663e\u7136\u4f1a\u51fa\u73b0 abi \u4e0d\u517c\u5bb9\u95ee\u9898\uff0c\u4f60\u4e5f\u4e0d\u77e5\u9053\u4e00\u4e2a\u7b2c\u4e09\u65b9\u5e93\u53ef\u80fd\u7528\u54ea\u79cd\u914d\u7f6e</li>\n</ol>\n<p>\u4e2a\u4eba\u89c9\u5f97 2GB \u4ee5\u4e0a\u5927\u6587\u4ef6\u5e76\u4e0d\u662f\u4ec0\u4e48\u5f88\u7f55\u89c1\u7684\u7528\u4f8b\uff0c\u4e3a\u4ec0\u4e48\u5f00\u53d1\u73af\u5883\u5c31\u4e0d\u80fd\u9ed8\u8ba4\u652f\u6301\u8fd9\u4e9b\u60c5\u51b5\u5462\uff0c\u96be\u9053\u8fd8\u5f71\u54cd\u517c\u5bb9\u6027\uff1f</p>\n<p>\u6807\u9898\u91cc\u7684\u201c\u4e3a\u672a\u6765\u51c6\u5907\u597d\u201d\u662f\u6307\uff0c\u53ea\u4f7f\u7528\u8de8\u5e73\u53f0\u7684 C/C++,\u52a0\u4e0a 2000 \u5e74\u540e\u7684 POSIX\uff1a</p>\n<ol>\n<li>\u5df2\u89e3\u51b3 2038 \u95ee\u9898</li>\n<li>\u9664\u975e\u660e\u786e\u8981\u6c42\uff0c\u5426\u5219\u6587\u672c\u5b58\u50a8\u548c IO \u90fd\u662f UTF-8 \u4e14\u4e0d\u4f7f\u7528 wchar_t</li>\n<li>\u65e0\u8bba\u73af\u5883\u5982\u4f55\u90fd\u80fd\u6b63\u786e\u5728 ui \u6216\u63a7\u5236\u53f0\u8f93\u51fa\u975e ASCII \u5b57\u7b26</li>\n<li>\u4e0d\u62d2\u7edd\u4f7f\u7528 IPv6</li>\n<li>\u652f\u6301\u957f\u8def\u5f84</li>\n<li>\u4fdd\u6301\u5bf9\u8fd1\u5341\u5e74\u51fa\u5382\u7684\u7cfb\u7edf\u548c\u786c\u4ef6\u7684\u652f\u6301</li>\n</ol>\n<p>\u4f3c\u4e4e\u8981\u5728\u65e0\u7b2c\u4e09\u65b9\u4f9d\u8d56\u7684\u60c5\u51b5\u4e0b\u505a\u5230\u8fd9\u4e2a\u662f\u5f88\u56f0\u96be\u7684\u4e8b\uff1f</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Noicdi", 
        "name": "Noicdi", 
        "avatar": "https://cdn.v2ex.com/avatar/8a48/fcf7/584185_large.png?m=1734936376"
      }, 
      "url": "https://www.v2ex.com/t/1202807", 
      "title": "\u8bf7\u6559\u5404\u4f4d centos 7.9 \u901a\u8fc7 devtoolset \u542f\u7528 c++14/17 \u65f6\u9047\u5230\u7684\u94fe\u63a5\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1202807", 
      "date_published": "2026-04-01T06:52:31+00:00", 
      "content_html": "<p>\u8fd9\u662f\u4e00\u4e2a Linux c++ \u7a0b\u5e8f\uff0c\u7f16\u8bd1\u548c\u90e8\u7f72\u5747\u5728 centOS 7.9/gcc 4.8.5 \u7684\u73af\u5883\u4e0a\u3002\u8fd9\u4e2a\u7a0b\u5e8f\u9700\u8981\u5bf9\u63a5\u591a\u79cd\u8bc1\u5238\u4ea4\u6613\u67dc\u53f0\u63d0\u4f9b\u7684\u4ea4\u6613 sdk \uff08\u5934\u6587\u4ef6\u548c\u52a8\u6001\u5e93\uff09\uff0c\u8fd9\u4e9b\u52a8\u6001\u5e93\u5927\u591a\u662f gcc 4.8.5 \u7f16\u8bd1\u51fa\u6765\u7684\u3002\u6839\u636e cmake \u914d\u7f6e\uff0c\u7a0b\u5e8f\u5728\u7f16\u8bd1\u671f\u51b3\u5b9a\u6700\u7ec8\u94fe\u63a5\u54ea\u79cd\u4ea4\u6613 sdk \u7684\u52a8\u6001\u5e93\uff0c\u5b8c\u6210\u7f16\u8bd1\u94fe\u63a5\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u867d\u7136\u8981\u9002\u914d\u591a\u79cd sdk \uff0c\u4f46\u5b9e\u9645\u4e0a\u8fd0\u884c\u671f\u53ea\u52a0\u8f7d\u4e86\u67d0\u4e00\u5bb6\u7684\u52a8\u6001\u5e93\u3002</p>\n<p>\u57fa\u4e8e gcc 4.8.5 \uff0c\u53ea\u80fd\u4f7f\u7528 c++11 \uff0c\u5982\u679c\u60f3\u4f7f\u7528 c++14/17 \uff0c\u90a3\u4e48\u53ef\u80fd\u9700\u8981\u8003\u8651\u5728\u9ad8\u7248\u672c\u53d1\u884c\u7248\u4e2d\u7f16\u8bd1\u7a0b\u5e8f\uff0c\u540c\u65f6\u6253\u5305\u5bf9\u5e94\u7684 gcc \u76f8\u5173\u7684\u52a8\u6001\u5e93\u3002\u6211\u7684\u7406\u89e3\u662f\u4e8c\u8fdb\u5236\u7a0b\u5e8f\u6240\u9700\u7684\u52a8\u6001\u5e93\u4f9d\u8d56\u7684 glibc \u53ef\u80fd\u4e0e centos 7.9 \u63d0\u4f9b\u7684\u4e0d\u7b26\u3002\u90a3\u4e48\u8fd9\u4e2a\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u8003\u8651 rhel/centos \u63d0\u4f9b\u7684 devtoolset \uff0c\u4ed6\u4eec\u4f7f\u7528\u7684\u662f\u5f53\u524d\u53d1\u884c\u7248\u63d0\u4f9b\u7684 glibc \u3002</p>\n<p>devtoolset 9/10/11 \u63d0\u4f9b\u4e86\u9ad8\u7248\u672c\u7684 gcc \uff0c\u652f\u6301\u4e86 c++11/14/17 \uff0c\u4f7f\u7528\u7684\u4e5f\u662f\u53d1\u884c\u7248\u5bf9\u5e94\u7684 glibc \u3002\u4f46\u662f libstdc++.so \u5462\uff1f\u5728\u8be2\u95ee ai \u65f6\uff0c\u63d0\u5230\u7684\u65b9\u6848\u5c31\u662f\u8bf4\u628a devtoolset \u63d0\u4f9b\u7684 libstdc++.so \u548c\u4e8c\u8fdb\u5236\u7a0b\u5e8f\u6253\u5305\u90e8\u7f72\uff0c\u8bbe\u7f6e library rpath \u6765\u52a0\u8f7d\u3002\u6211\u8003\u8651\u8bf4\uff0c\u5982\u679c\u6211\u4f7f\u7528\u7684\u662f devtoolset \u4e2d\u63d0\u4f9b\u7684 libstdc++.so \uff0c\u90a3\u4e48\u7a0b\u5e8f\u5728\u8fd0\u884c\u65f6\u52a0\u8f7d\u7684\u5c31\u662f\u8fd9\u4e2a\u7248\u672c\u7684\uff0c\u53c8\u4f1a\u4e0e\u4ea4\u6613 sdk \u7684\u52a8\u6001\u5e93\u6240\u9700\u7684\u7248\u672c\u4e0d\u7b26\uff0c\u53ef\u80fd\u4f1a\u4ea7\u751f\u95ee\u9898\u3002ai \u4e5f\u8bf4\u662f\u8fd9\u4e48\u4e2a\u7406\u513f\u3002\u6211\u5c31\u653e\u5f03\u4e86\u4f7f\u7528 c++14/17 \u7684\u5ff5\u5934\u3002</p>\n<p>\u4f46\u662f\u6211\u4eca\u5929\u60f3\u8d77\u8fd9\u4e2a\u4e8b\u60c5\uff0c\u53c8\u60f3\u6298\u817e\u4e00\u4e0b\uff0c\u6211\u53d1\u73b0 ai \u63d0\u5230 devtoolset-9 \u7684 libstdc++.so.6 \u5728 <code>/opt/rh/devtoolset-9/root/usr/lib64</code>\uff0c\u6211\u5728\u8fd9\u4e2a\u76ee\u5f55\u4e0b\u9762\u6839\u672c\u6ca1\u7ffb\u5230 libstdc++.so.6 \uff0c\u800c\u662f\u7ffb\u5230\u4e86 <code>/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/libstdc++.so</code>\uff0c\u8fd9\u73a9\u610f\u513f\u4e0d\u662f\u52a8\u6001\u5e93\uff0c\u800c\u662f\u4e2a ASCII text \uff0c\u5185\u5bb9\u5982\u4e0b\uff1a</p>\n<pre><code>/* GNU ld script\n   Use the shared library, but some functions are only in\n   the static library, so try that secondarily.  */\nOUTPUT_FORMAT(elf64-x86-64)\nINPUT ( /usr/lib64/libstdc++.so.6 -lstdc++_nonshared )\n</code></pre>\n<p>\u4e5f\u5c31\u662f\u8bf4\uff0c\u5b9e\u9645\u4e0a devtoolset \u5e76\u4e0d\u63d0\u4f9b libstdc++.so \uff0c\u800c\u662f\u4f7f\u7528\u7684\u53d1\u884c\u7248\u9ed8\u8ba4\u7684\uff1b\u540c\u65f6\u901a\u8fc7 <code>/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/libstdc++_nonshared.a</code> \u6765\u8865\u5145\u9ad8\u7248\u672c c++ \u6807\u51c6\u5e93\u6240\u9700\u7684\u5b9e\u73b0\uff1f</p>\n<p>\u90a3\u6211\u662f\u4e0d\u662f\u53ef\u4ee5\u901a\u8fc7 devtoolset \u6765\u4f7f\u7528 c++14/17 \uff0c\u540c\u65f6\u94fe\u63a5 centos 7.9 \u63d0\u4f9b\u7684 libstdc++.so.6 \u7ed9\u4e8c\u8fdb\u5236\u7a0b\u5e8f\u548c\u4ea4\u6613 sdk \u52a8\u6001\u5e93\u4f7f\u7528\uff0c\u4e0d\u9700\u8981\u62c5\u5fc3\u51b2\u7a81\u95ee\u9898\uff0c\u9876\u591a\u5728\u7528\u4e2a GLIBCXX_USE_CXX11_ABI \u6765\u5904\u7406\u95ee\u9898\uff1f</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/DearFox", 
        "name": "DearFox", 
        "avatar": "https://cdn.v2ex.com/gravatar/f8df6c11f09cfe84cba114f98f24da53?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1188203", 
      "title": "\u6c42\u5927\u4f6c\u6307\u70b9:Windows \u4e0a c++\u90e8\u7f72\u6700\u65b0 Paddleocr,\u65e0\u6cd5\u901a\u8fc7\u5185\u5b58\u8bc6\u5b57", 
      "id": "https://www.v2ex.com/t/1188203", 
      "date_published": "2026-01-25T11:46:35+00:00", 
      "content_html": "\u90fd\u662f\u5b98\u65b9\u7684\u4ee3\u7801,\u53ea\u80fd\u8def\u5f84\u8bc6\u56fe,\u6539\u6210\u5185\u5b58\u52a0\u8f7d\u56fe\u7247\u540e:<br />        cv::Mat img = cv::imread(png_path);<br />        if (img.empty()) {<br />            std::cerr &lt;&lt; \"\u9519\u8bef\uff1a\u65e0\u6cd5\u5728\u5f53\u524d\u76ee\u5f55\u627e\u5230 123.png\" &lt;&lt; std::endl;<br />            return 1;<br />        }<br /><br />        // \u6838\u5fc3\u63a5\u53e3\uff1a\u76f4\u63a5\u5c06 cv::Mat \u5bf9\u8c61\u4f20\u5165 Predict \u51fd\u6570<br /><br />       auto outputs = ocr.Predict(img);<br />\u8fd9\u6700\u540e\u4e00\u53e5\u6b7b\u6d3b\u5c31\u5361\u8fd9\u4e24\u53e5\u62a5\u9519<br />     \u201ctype\u201d: \u672a\u58f0\u660e\u7684\u6807\u8bc6\u7b26<br />\t\"type\": \u4e0d\u662f \"cv::DataType&lt;T&gt;\" \u7684\u6210\u5458<br />    1&gt;D:\\Program Files (x86)\\opencv\\build\\include\\opencv2\\core\\traits.hpp(386,31): error \t\tC2065: \u201ctype\u201d: \u672a\u58f0\u660e\u7684\u6807\u8bc6\u7b26<br />\u95ee AI,\u5934\u6587\u4ef6\u987a\u5e8f,\u5404\u79cd\u82b1\u6837\u90fd\u8bd5\u4e86,\u5c31\u662f\u65e0\u6cd5\u89e3\u51b3,\u53ea\u8981\u662f\u901a\u8fc7\u5185\u5b58\u7684\u5f62\u5f0f ocr.Predict(img);\u5c31\u62a5\u9519,\u6211\u4e5f\u662f\u4e2a\u83dc\u9e1f,\u6ca1\u4e00\u70b9\u529e\u6cd5"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/maredbf", 
        "name": "maredbf", 
        "avatar": "https://cdn.v2ex.com/gravatar/9764edd377e684fa0864cc256915cadb?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1179116", 
      "date_modified": "2025-12-15T23:43:55+00:00", 
      "content_html": "<p>\u6211\u7528 C++ \u5b9e\u73b0\u4e86\u4e00\u4e2a\u6a21\u5f0f\u5339\u914d\u5e93 Patternia\uff1a\n<a href=\"https://github.com/sentomk/patternia\" rel=\"nofollow\">https://github.com/sentomk/patternia</a></p>\n<p>\u76ee\u524d\u6574\u4f53\u8bbe\u8ba1\u4e0e\u5b9e\u73b0\u5df2\u7ecf\u8d8b\u4e8e\u7a33\u5b9a\uff0c\u5177\u5907\u5b9e\u9645\u53ef\u7528\u6027\uff0c\u4f46\u4ecd\u7136\u975e\u5e38\u4f9d\u8d56\u771f\u5b9e\u4f7f\u7528\u573a\u666f\u6765\u66b4\u9732\u8bbe\u8ba1\u4e0e\u8bed\u4e49\u5c42\u9762\u7684\u4e0d\u8db3\uff0c\u56e0\u6b64\u975e\u5e38\u6b22\u8fce issue \u3001\u53cd\u9988\u6216\u8bbe\u8ba1\u5c42\u9762\u7684\u8ba8\u8bba\u3002</p>\n<p>Patternia \u65e8\u5728\u4ee5\u96f6\u8fd0\u884c\u65f6\u5f00\u9500\u7684\u65b9\u5f0f\uff0c\u4e3a C++ \u63d0\u4f9b\u4e00\u79cd\u66f4\u7ed3\u6784\u5316\u3001\u66f4\u5177\u8868\u8fbe\u529b\u7684\u6761\u4ef6\u5206\u652f\u4e0e\u6570\u636e\u89e3\u6784\u673a\u5236\uff0c\u4f7f\u63a7\u5236\u6d41\u80fd\u591f\u56f4\u7ed5\u6570\u636e\u7684\u5f62\u6001\u4e0e\u8bed\u4e49\u5c55\u5f00\uff0c\u800c\u4e0d\u662f\u5206\u6563\u5728\u5927\u91cf if / switch \u4e0e\u624b\u52a8\u89e3\u6784\u4e4b\u4e2d\u3002</p>\n<p>\u5f53\u524d\u5df2\u652f\u6301\u7684\u6838\u5fc3\u80fd\u529b\u5305\u62ec\uff08\u4f46\u4e0d\u9650\u4e8e\uff09\uff1a</p>\n<ul>\n<li>\u503c\u6a21\u5f0f\u4e0e\u5b57\u9762\u91cf\u5339\u914d</li>\n<li>\u7ed3\u6784\u5316\u5339\u914d\u4e0e\u6210\u5458\u89e3\u6784</li>\n<li>\u7ed1\u5b9a\u6a21\u5f0f\u4e0e\u5360\u4f4d\u7b26</li>\n<li>\u5b88\u536b\u6a21\u5f0f\uff08 guard \uff09\u4e0e\u81ea\u5b9a\u4e49\u8c13\u8bcd\u7ea6\u675f</li>\n</ul>\n<p>\u53ef\u4ee5\u53c2\u8003\u8fd9\u91cc\u7684\u793a\u4f8b\u96c6\u5408\u6765\u76f4\u89c2\u770b\u770b Patternia \u7684\u5b9e\u9645\u7528\u6cd5\uff1a\n<a href=\"https://github.com/sentomk/patternia/tree/main/samples\" rel=\"nofollow\">https://github.com/sentomk/patternia/tree/main/samples</a></p>\n<p>\u5bf9 variant \u7b49\u4ee3\u6570\u5f0f\u6570\u636e\u7ed3\u6784\u4ee5\u53ca\u8fd0\u884c\u65f6\u591a\u6001\u7684\u6a21\u5f0f\u5339\u914d\u5df2\u5728\u89c4\u5212\u4e2d\uff0c\u540e\u7eed\u7684\u7a33\u5b9a\u7248\u672c\u4e5f\u5c06\u9010\u6b65\u5b8c\u5584\u7a77\u5c3d\u6027\u68c0\u67e5\u4e0e\u7f16\u8bd1\u671f\u8bca\u65ad\u80fd\u529b\u3002</p>\n", 
      "date_published": "2025-12-15T19:19:28+00:00", 
      "title": "\u4e3a c++ \u63d0\u4f9b\u6a21\u5f0f\u5339\u914d", 
      "id": "https://www.v2ex.com/t/1179116"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Hackerl", 
        "name": "Hackerl", 
        "avatar": "https://cdn.v2ex.com/gravatar/5c783d5e527a837a5bd0b3d9eb9da607?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1177007", 
      "title": "\u5206\u4eab\u4e00\u4e0b\u6211\u4e2a\u4eba\u5f00\u6e90\u7684 C++23 \u534f\u7a0b\u7f51\u7edc\u6846\u67b6", 
      "id": "https://www.v2ex.com/t/1177007", 
      "date_published": "2025-12-04T15:23:21+00:00", 
      "content_html": "<p><a href=\"https://github.com/Hackerl/asyncio\" rel=\"nofollow\">https://github.com/Hackerl/asyncio</a></p>\n<p><code>asyncio</code> \u662f\u4e00\u4e2a\u57fa\u4e8e <code>libuv</code> \u7684\u534f\u7a0b\u7f51\u7edc\u6846\u67b6\uff0c\u4f7f\u7528 <code>C++23</code> \u5f00\u53d1\uff0c\u652f\u6301 <code>Linux</code>/<code>Windows</code>/<code>Android</code>/<code>macOS</code> \u56db\u4e2a\u4e3b\u6d41\u5e73\u53f0\u3002</p>\n<p>\u5b83\u7edd\u4e0d\u662f\u4e00\u4e2a\u73a9\u5177\uff0c\u800c\u662f\u53ef\u4ee5\u771f\u6b63\u7528\u4e8e\u751f\u4ea7\u7684\u4ee3\u7801\u3002\u5728\u6211\u516c\u53f8\u5185\u90e8\uff0c\u57fa\u4e8e\u5b83\u7814\u53d1\u7684\u8f6f\u4ef6\uff0c\u5df2\u8fd0\u884c\u5728\u4e86\u6570\u4e07\u53f0\u5458\u5de5\u7684\u529e\u516c PC \u4e0a\uff08<code>Windows</code>/<code>macOS</code>\uff09\uff0c\u7ebf\u4e0a <code>Linux</code> \u670d\u52a1\u5668\u4e5f\u6b63\u5728\u9010\u6b65\u8986\u76d6\u3002</p>\n<p>\u9879\u76ee\u6709\u4f55\u4f18\u70b9\uff1f</p>\n<ul>\n<li>\u7b80\u5355\u3001\u7cbe\u5de7\u7684\u4ee3\u7801</li>\n<li>\u7075\u6d3b\u3001\u4f18\u96c5\u7684\u5b50\u4efb\u52a1\u7ba1\u7406</li>\n<li>\u501f\u9274\u81ea\u591a\u79cd\u8bed\u8a00\uff0c\u6613\u4e8e\u4f7f\u7528\u7684 <code>API</code></li>\n<li>\u501f\u9274\u81ea\u591a\u79cd\u8bed\u8a00\uff0c\u8bbe\u8ba1\u4f18\u826f\u7684\u63a5\u53e3</li>\n<li>\u7b80\u5355\u76f4\u63a5\u7684\u4efb\u52a1\u53d6\u6d88\u673a\u5236</li>\n<li>\u57fa\u4e8e\u7ebf\u7a0b\u3001\u7ebf\u7a0b\u6c60\u53ef\u4ee5\u8f7b\u677e\u878d\u5408\u540c\u6b65\u4ee3\u7801</li>\n</ul>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/jianglibo", 
        "name": "jianglibo", 
        "avatar": "https://cdn.v2ex.com/avatar/a8d3/b1e3/9336_large.png?m=1769165931"
      }, 
      "url": "https://www.v2ex.com/t/1176844", 
      "date_modified": "2025-12-04T03:11:23+00:00", 
      "content_html": "<p>C++\u4ec0\u4e48\u4f1a\u5f97\u5230\u50cf\u6211\u8fd9\u6837\u8001\u5e74\u4eba\u7684\u559c\u7231\uff1f</p>\n<p>\u9996\u5148 C++\u8fd9\u4e2a\u8bed\u8a00\u8868\u8fbe\u529b\u53ca\u5176\u4e30\u5bcc\uff0c\u4ee5\u81f3\u4e8e\u521d\u5b66\u8005\u4e0d\u77e5\u6240\u63aa\uff0c\u7ecf\u5e38\u4f1a\u770b\u5230\u4e0d\u8ba4\u8bc6\u7684\u8bed\u6cd5\uff0c\u8fd9\u662f\u5728\u5176\u5b83\u8bed\u8a00\u4e0d\u592a\u4f1a\u7ecf\u5386\u5230\u7684\u3002 \u4f46\u662f\u5b83\u6240\u6709\u7684\u590d\u6742\u6027\u90fd\u670d\u52a1\u4e8e\u4e00\u4e2a\u76ee\u6807\uff0c\u62bd\u8c61(abstraction)\u3002\u62bd\u8c61\u662f\u4e00\u4e2a\u9ad8\u7ea7\u7684\u601d\u8003\u8fc7\u7a0b\uff0c\u5b83\u8bd5\u56fe\u4ece\u6742\u4e71\u65e0\u7ae0\u4e2d\u627e\u5230\u6a21\u5f0f\u3002</p>\n<p>\u4e0d\u77e5\u5404\u4f4d\u6709\u6ca1\u6709\u7528\u8fc7 boost json \uff0cjson \u4ec5\u6709\u51e0\u79cd\u6709\u9650\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5927\u90e8\u5206\u8bed\u8a00\u6709\u7c7b(class)\uff0c\u7528\u5b83\u6765\u62bd\u8c61\u8fd9\u4e9b\u6570\u636e\u7c7b\u578b\u4e5f\u633a\u4e0d\u9519\uff0cc++\u4e5f\u662f OOP \u3002 \u4f46\u662f C++\u8fd8\u6709 <code>std::variant</code>\uff0c\u5c31\u662f\u8bf4\u5982\u679c\u4e00\u4e2a\u4e1c\u897f\u53ea\u53ef\u80fd\u6709\u56fa\u5b9a\u7684\u51e0\u4e2a\u7c7b\u578b\uff0c\u90a3\u4e48\u7528<code>std::variant</code>\u6765\u62bd\u8c61\u66f4\u6070\u5f53\uff08\u4e5f\u53ef\u80fd\u66f4\u5feb\uff0c\u66f4\u4e0d\u5bb9\u6613\u9519\uff0c\u6216\u8005\u65e0\u6cd5\u9519)\u3002</p>\n<p>\u5176\u5b83\u6bd4\u5982<code>shared_from_this</code>\u7b49\u90fd\u662f\u4e3a\u89e3\u51b3\u95ee\u9898\u800c\u751f\uff0c\u5982\u679c\u4f60\u6ca1\u6709\u78b0\u5230\u95ee\u9898\uff0c\u90a3\u4e48\u4f60\u5c31\u4e0d\u4f1a\u6df1\u5165\u7406\u89e3<code>shared_from_this</code>\u3002\u5b83\u662f\u4e3a\u4e86\u5728\u5f02\u6b65\u73af\u5883\u4e2d\u8ba9\u5bf9\u8c61\u81ea\u5df1\u4fdd\u6301\u6d3b\u7740\uff0c\u4e0d\u7136\u5f02\u6b65\u56de\u8c03\u65f6\u5982\u679c\u5bf9\u8c61\u5df2\u7ecf\u9500\u6bc1\uff0c\u5c31\u4f1a UAF \u3002</p>\n<pre><code>namespace certctrl {\n\nclass UpdateHandler : public IHandler, \n                      public std::enable_shared_from_this&lt;UpdateHandler&gt; {\nprivate:\n  certctrl::ICertctrlConfigProvider &amp;config_provider_;\n  customio::ConsoleOutput &amp;output_;\n  client_async::HttpClientManager &amp;http_client_;\n  certctrl::CliCtx &amp;cli_ctx_;\n  std::shared_ptr&lt;AgentUpdateChecker&gt; update_checker_;\n\n  // Platform detection\n  std::string detect_platform();\n  std::string detect_architecture();\n  \n  // Update workflow steps\n  monad::IO&lt;bool&gt; check_for_updates(const std::string &amp;current_version);\n  monad::IO&lt;bool&gt; confirm_update();\n  monad::IO&lt;void&gt; perform_update();\n  monad::IO&lt;std::string&gt; download_update(const std::string &amp;download_url);\n  monad::IO&lt;void&gt; install_update(const std::string &amp;downloaded_file);\n  monad::IO&lt;void&gt; backup_current_binary();\n  monad::IO&lt;void&gt; replace_binary(const std::string &amp;new_binary_path);\n  \n  // Helper methods\n  std::string get_current_binary_path();\n  std::string generate_backup_path();\n  bool verify_downloaded_file(const std::string &amp;file_path, const std::string &amp;checksum_url);\n\npublic:\n  UpdateHandler(certctrl::ICertctrlConfigProvider &amp;config_provider,\n                customio::ConsoleOutput &amp;output,\n                client_async::HttpClientManager &amp;http_client,\n                certctrl::CliCtx &amp;cli_ctx,\n                std::shared_ptr&lt;AgentUpdateChecker&gt; update_checker);\n\n  std::string command() const override;\n  monad::IO&lt;void&gt; start() override;\n};\n\n}\n</code></pre>\n<p>\u5f53\u7136\u8fd9\u91cc\u4ec5\u4ec5\u4e3e\u51e0\u4e2a\u4f8b\u5b50\uff0c\u6bcf\u4e00\u4e2a\u7279\u6027\u90fd\u662f\u4e3a\u89e3\u51b3\u95ee\u9898\u800c\u8bbe\u8ba1\u7684\u3002</p>\n<p>\u8bf4\u5230\u4e3a\u4ec0\u4e48\u5e74\u957f\u8005\u66f4\u559c\u6b22 c++\uff0c\u6211\u4f30\u8ba1\u53ef\u80fd\u548c\u5927\u8111\u7684\u62bd\u8c61\u80fd\u529b\u76f8\u5173\uff0c\u6211\u4e0d\u662f\u8111\u79d1\u5b66\u4e13\u5bb6\uff0c\u6211\u8fd8\u95ee\u4e86 chatgpt \uff0c\u5b83\u7684\u7b54\u590d\uff1a</p>\n<pre><code>\u60c5\u51b5\t\u7ed3\u679c\n\u7eaf\u903b\u8f91\u3001\u975e\u7ecf\u9a8c\u6027\u7684\u62bd\u8c61\u4efb\u52a1\uff08\u6570\u5b66\u63a8\u7406\u3001\u5f62\u72b6\u7c7b\u6bd4\u3001\u65e0\u8bed\u8a00\u56fe\u5f62\u6d4b\u8bd5\uff09\t\u5e74\u8f7b\u4eba\u901a\u5e38\u66f4\u5f3a\n\u57fa\u4e8e\u7ecf\u9a8c\u7684\u62bd\u8c61\u603b\u7ed3\u3001\u6a21\u5f0f\u8bc6\u522b\t\u5e74\u957f\u8005\u53ef\u80fd\u66f4\u5f3a\n\u9700\u8981\u540c\u65f6\u62bd\u8c61 + \u5904\u7406\u5927\u91cf\u65b0\u4fe1\u606f\u7684\u4efb\u52a1\t\u5e74\u8f7b\u4eba\u66f4\u5feb\n\u9700\u8981\u62bd\u8c61 + \u57fa\u4e8e\u7ecf\u9a8c\u7684\u5224\u65ad\t\u5e74\u957f\u8005\u8868\u73b0\u53ef\u80fd\u66f4\u4f73\n</code></pre>\n<p>\u6240\u4ee5\u66f4\u51c6\u786e\u7684\u7ed3\u8bba\u5e94\u8be5\u662f\uff0c\u7ecf\u9a8c\u4e30\u5bcc\u7684\u7f16\u7a0b\u8005\u53ef\u80fd\u4f1a\u9009\u62e9 C++\u3002 \u5982\u679c\u4f60\u662f\u521d\u5b66\u8005\uff0c\u4e0d\u8981\u4e3a C++\u7684\u590d\u6742\u5ea6\u56f0\u6270\uff0c\u8fd9\u9700\u8981\u4e00\u4e2a\u8fc7\u7a0b\uff0c\u4e00\u4e2a\u8fdb\u6b65\u7684\u8fc7\u7a0b\u3002</p>\n", 
      "date_published": "2025-12-04T03:05:49+00:00", 
      "title": "\u4e3a\u4ec0\u4e48\u5199 C++\u7684\u4eba\u5e74\u9f84\u504f\u5927\uff1f", 
      "id": "https://www.v2ex.com/t/1176844"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/wnpllrzodiac", 
        "name": "wnpllrzodiac", 
        "avatar": "https://cdn.v2ex.com/gravatar/84e41a23f65477d2c3c398dc13c8e053?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1176454", 
      "date_modified": "2025-12-02T11:16:13+00:00", 
      "content_html": "\u539f\u9879\u76ee\u662f\u7ee7\u7eed windows \u7684\uff0c\u5927\u91cf windows api mfc atl \u548c windows \u8d44\u6e90\u7684\u4f7f\u7528\u3002\u8fd8\u6709 rpc \u548c\u8de8\u8fdb\u7a0b\u7684 handle \u5171\u4eab\u663e\u793a\u3002\u51e0\u5e74\u524d\u5b8c\u6210\u4e86 mac \u7684\u79fb\u690d\uff0c\u505a\u4e86\u5927\u91cf\u7684\u517c\u5bb9\u548c stub \u4ee3\u7801\u3002\u5e73\u53f0\u5b8f\u5b9a\u4e49\u6ee1\u5730\u90fd\u662f\u3002<br /><br />\u73b0\u5728\u5b8c\u6210\u7f16\u8bd1\u94fe\u63a5\u5de5\u4f5c\u3002\u8fd0\u884c\u8d77\u6765\u5404\u79cd crash,\u51e0\u5341\u5e74\u7684\u7956\u4f20\u4ee3\u7801\u611f\u89c9\u7528 ai \u8c03\u5185\u5b58\u95ee\u9898\u4e5f\u56f0\u96be\u91cd\u91cd\u3002<br /><br />\u662f\u4e0d\u662f\u5927\u516c\u53f8\u9879\u76ee\u65b9\u5411\u5bf9\uff0c\u5728\u7ee7\u7eed\u5c31\u884c\uff1f\u6700\u540e\u80fd\u4e0d\u80fd\u51fa\u4e1c\u897f\uff0c\u6839\u672c\u5c31\u6ca1\u4eba\u7ba1\uff1f", 
      "date_published": "2025-12-02T11:01:00+00:00", 
      "title": "\u5927\u578b c++\u9879\u76ee\uff0c\u5728 ai \u5e2e\u52a9\u4e0b\u5b8c\u6210 Linux \u5e73\u53f0\u79fb\u690d\uff0c\u53ef\u884c\u6027\u591a\u5927\uff1f", 
      "id": "https://www.v2ex.com/t/1176454"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/aqtata", 
        "name": "aqtata", 
        "avatar": "https://cdn.v2ex.com/avatar/be60/9f31/171110_large.png?m=1764074284"
      }, 
      "url": "https://www.v2ex.com/t/1176175", 
      "title": "\u5c11\u7528 auto", 
      "id": "https://www.v2ex.com/t/1176175", 
      "date_published": "2025-12-01T08:19:17+00:00", 
      "content_html": "<p>\u9664\u975e\u7c7b\u578b\u7279\u522b\u957f\uff0c\u5426\u5219\u5c11\u7528 auto \uff0c\u5bf9 AI \u4e0d\u53cb\u597d</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/moudy", 
        "name": "moudy", 
        "avatar": "https://cdn.v2ex.com/gravatar/cdb3b37880cc74e53c75c571c1c934b5?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1175298", 
      "date_modified": "2025-11-27T00:33:32+00:00", 
      "content_html": "<p>static EntryType Graph::getEntryPoint()\n{\nreturn \"_start\";\n}</p>\n<p>void MyClass::init(Graph &amp;g)\n{\nconst EntryType entry = Graph::getEntryPoint();\n}</p>\n<p>\u8fd9\u4e48\u7b80\u5355\u7684\u4e00\u6bb5\u7a0b\u5e8f\uff0c\u8c03\u8bd5\u65f6\u770b entry \u7684\u503c\uff0c\u91cc\u9762\u5b58\u7684\u4e1c\u897f\u8ddf\"_start\"\u534a\u6bdb\u94b1\u5173\u7cfb\u90fd\u6ca1\u6709\u3002 \u56e0\u4e3a\"_start\"\u4f20\u51fa\u53bb\u65f6\u9690\u5f0f cast \u6210 EntryType \uff0c\u7136\u540e EntryType \u5b9e\u73b0\u7684\u8f6c\u6362\u64cd\u4f5c\u91cc\u505a\u4e86\u4e00\u5806\u9a9a\u64cd\u4f5c\u3002</p>\n", 
      "date_published": "2025-11-26T19:11:50+00:00", 
      "title": "\u518d\u4e00\u6b21\u611f\u89c9\u5230 C++\u7684\u6076\u5fc3", 
      "id": "https://www.v2ex.com/t/1175298"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/YangJiLei", 
        "name": "YangJiLei", 
        "avatar": "https://cdn.v2ex.com/avatar/99db/a25d/594741_large.png?m=1764035086"
      }, 
      "url": "https://www.v2ex.com/t/1174824", 
      "title": "\u5206\u5e03\u5f0f\u5b58\u50a8", 
      "id": "https://www.v2ex.com/t/1174824", 
      "date_published": "2025-11-25T01:46:13+00:00", 
      "content_html": "<p>\u524d\u9762\u6211\u542c\u5404\u4f4d\u5927\u4f6c\u7684\u5728 MIT \u5b66\u4e86\u5206\u5e03\u5f0f\u7684\u90a3\u4e2a\u89c6\u9891\uff0c\u4e5f\u8fdb\u884c\u590d\u73b0\u4e86\u8bfe\u4e0a\u7684\u5185\u5bb9\u3002\n\u4e0b\u4e00\u6b65\u5b66\u4e60\u5206\u5e03\u5f0f\u5b58\u50a8\u6211\u5e94\u8be5\u5b66\u4e60\u54ea\u4e9b\u554a\u3002\u4e0b\u4e00\u6b65\u5e94\u8be5\u505a\u4ec0\u4e48\u3002\n\u611f\u8c22\u5404\u4f4d\u5927\u4f6c</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/zcion", 
        "name": "zcion", 
        "avatar": "https://cdn.v2ex.com/gravatar/01be0b4e4d10c4d12ed83ef0a87bcebd?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1174410", 
      "title": "[\u6c42\u52a9] Linux \u6709\u4ec0\u4e48\u597d\u7684\u5f15\u5165 c++ \u7b2c\u4e09\u65b9\u5e93\u7684\u65b9\u6848", 
      "id": "https://www.v2ex.com/t/1174410", 
      "date_published": "2025-11-22T11:36:38+00:00", 
      "content_html": "<h2>\u95ee\u9898</h2>\n<p>\u4e4b\u524d\u7528 windows \u5f00\u53d1\uff0c\u4e3a\u4e86\u7edf\u4e00\u4f7f\u7528\u7b2c\u4e09\u65b9\u5e93\u884c\u4e3a\uff0c\u6211\u4e60\u60ef cmake + vcpkg \u8fd9\u5957\uff0c\u76f4\u63a5\u7528\u4e0a vcpkg.cmake \u540e\u5728 cmake \u4e2d <code>find_package</code> \u5c31\u884c\u3002</p>\n<p>\u800c linux \u5df2\u7ecf\u6709\u81ea\u5df1\u7684\u5305\u7ba1\u7406\u5668\u4e86\uff0c\u6211\u76f4\u63a5 pacman \u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684\u4e0b\u8f7d\u7b2c\u4e09\u65b9\u5e93\u3002\u4f46\u95ee\u9898\u662f\u6709\u54ea\u4e9b\u7edf\u4e00\u884c\u4e3a\u80fd\u591f\u5728 cmake \u5f15\u5165 pacman \u4e0b\u8f7d\u7684\u5185\u5bb9\uff08\u5934\u6587\u4ef6+\u5e93\u6587\u4ef6\uff09\uff1f</p>\n<h2>\u6211\u7684\u4e00\u4e9b\u60f3\u6cd5</h2>\n<p>\u6211\u80fd\u60f3\u5230\u7684\u662f\u901a\u8fc7 pkg-config \u53bb\u7edf\u4e00\u7ba1\u7406\uff0c\u5728 cmake \u4e2d <code>find_package(PkgConfig)</code>\uff0c\u7136\u540e\u7528 pkg-config \u7684\u4e1c\u897f\u53bb\u5f15\u5165\u3002 </p>\n<p>\u4f46\u5f53\u6211\u901a\u8fc7 pacman \u4e0b\u8f7d boost \u65f6\uff08 boost \u548c boost-libs \uff09\uff0c\u7528 pkg-config \u627e\u4e0d\u5230\u5bf9\u5e94\u7684\u6587\u4ef6\uff08\u4f8b\u5982\u6211\u60f3\u5f15\u5165 asio \u5e93\uff0c\u4f46 pkg-config --list-all | grep asio \u627e\u4e0d\u5230\u76f8\u5173\u7684\u5185\u5bb9\uff09\u3002\u901a\u8fc7 pacman \u4e0b\u8f7d\u7684 boost \u4f3c\u4e4e\u6ca1\u6709\u63d0\u4f9b .pc \u6587\u4ef6\uff0c\u5bfc\u81f4 pkg-config \u4e0d\u77e5\u9053\u8fd9\u4e48\u4e2a\u4e1c\u897f\u3002</p>\n<p>\u53e6\u5916\u6211\u80fd\u60f3\u5230\u7684\u662f\uff0c\u624b\u52a8\u7684\u5728 cmake \u4e2d <code>find_library</code> \u548c <code>find_path</code> \u5f15\u5165\u5e93\u6587\u4ef6\u548c\u5934\u6587\u4ef6\uff0c\u4f46\u8fd9\u6837\u592a\u9ebb\u70e6\u4e86\uff08\u4f8b\u5982\u8981\u4f7f\u7528 ffmpeg \uff0c\u90a3\u6211\u5f97\u5206\u522b\u624b\u52a8\u641c\u7d22 libavformat \u3001libavcodec \u3001libavutil \u3001libswscale \u7684\u5934\u6587\u4ef6\u548c\u5e93\u6587\u4ef6\uff09\uff0c\u7528 \t<code>find_package</code> \u5012\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u89e3\u51b3\uff0c\u4f46 pacman \u4e0b\u8f7d\u7684\u4f9d\u8d56\u4f3c\u4e4e\u6ca1\u6709\u63d0\u4f9b\u76f8\u5173\u7684 .cmake \u6587\u4ef6\uff1f</p>\n<h2>so \uff1f</h2>\n<p>\u4f3c\u4e4e pkg-config \u4e0d\u662f\u7ec8\u6781\u89e3\u51b3\u65b9\u6848\uff0c\u6240\u4ee5\u6709\u4ec0\u4e48\u65b9\u6848\u80fd\u591f\u7edf\u4e00\u5f15\u5165\u4f9d\u8d56\u7684\u884c\u4e3a\u3002\u96be\u9053\u8fd8\u8981\u7ee7\u7eed\u4f7f\u7528 vcpkg \u5417\uff1f\uff08\u786e\u5b9e\u597d\u7528\uff0c\u4f46\u770b\u4e00\u4e9b\u4eba\u7684\u8bf4\u6cd5\u662f linux \u4e0a\u5efa\u8bae\u4f7f\u7528\u81ea\u5e26\u7684\u5305\u7ba1\u7406\u5668\uff09</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Ainokiseki", 
        "name": "Ainokiseki", 
        "avatar": "https://cdn.v2ex.com/gravatar/9ee45647f863b0aef5fdb5fd3966321e?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1172208", 
      "title": "[\u6c42\u52a9]\u8bf7\u6559\u4e00\u4e2a C++\u591a\u7ebf\u7a0b\u7684\u6027\u80fd\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1172208", 
      "date_published": "2025-11-12T02:42:15+00:00", 
      "content_html": "LZ \u53d7\u547d\u4f7f\u7528\u591a\u7ebf\u7a0b\u63d0\u9ad8\u67d0\u4e2a\u7a0b\u5e8f\u7684\u8fd0\u884c\u6548\u7387\u3002\u539f\u6765\u7a0b\u5e8f\u7684\u884c\u4e3a\u5927\u6982\u662f step0,step1,step2 \u4e4b\u540e\u56de\u5230 step0 \uff0c\u5faa\u73af\u82e5\u5e72\u6b21\u3002LZ \u628a step1 \u548c step2 \u7684\u4e00\u90e8\u5206\u6d41\u7a0b\u5e76\u884c\u5316\uff0c\u5f00\u4e86\u4e09\u4e2a\u540e\u53f0\u7ebf\u7a0b\u505a\u6d88\u8d39\u8005\uff0c\u4e3b\u7ebf\u7a0b\u628a\u4efb\u52a1\u653e\u5728\u961f\u5217\u91cc\u9762\uff0c\u6d88\u8d39\u8005\u7ebf\u7a0b\u62ff\u53d6\u4e4b\u540e\u8fd0\u884c\uff0c\u8fd0\u884c\u5b8c\u6bd5\u540e\u4e3b\u7ebf\u7a0b\u7ee7\u7eed\u3002\u4ee3\u7801\u5982\u4e0b\uff1a<br /><br />```<br />        std::vector&lt;std::future&lt;void&gt;&gt;futures;<br />        for(auto npg:m_NPGs){<br />            futures.emplace_back(ThreadPoolSingleton::getNPCInstance(threadNum.getValue()).enqueue([this,npg]() {<br />             npg-&gt;cycleStep1();<br />            }));  <br />        }<br />       <br />       for(auto &amp;k:futures){<br />           k.wait();<br />           }<br />```<br />\u7ebf\u7a0b\u6c60\u4ee3\u7801\u5982\u4e0b\uff1a<br />```<br />inline ThreadPool::ThreadPool(size_t threads)<br />    :   stop(false)<br />{<br />    for(size_t i = 0;i&lt;threads;++i)<br />        workers.emplace_back(<br />            [this]<br />            {<br />                for(;;)<br />                {<br />                    std::function&lt;void()&gt; task;<br /><br />                    {<br />                        std::unique_lock&lt;std::mutex&gt; lock(this-&gt;queue_mutex);<br />                        this-&gt;condition.wait(lock,<br />                            [this]{ return this-&gt;stop || !this-&gt;tasks.empty(); });<br />                        if(this-&gt;stop &amp;&amp; this-&gt;tasks.empty())<br />                            return;<br />                        task = std::move(this-&gt;tasks.front());<br />                        this-&gt;tasks.pop();<br />                    }<br /><br />                    task();<br />                }<br />            }<br />        );<br />}<br />```<br />\u7136\u800c\u51fa\u4e4e\u697c\u4e3b\u9884\u6599\u7684\u662f\uff0c\u4f7f\u7528\u591a\u7ebf\u7a0b\u4e4b\u540e\u6027\u80fd\u4e0d\u589e\u53cd\u964d\uff0c\u8fdb\u4e00\u6b65\u5206\u6790\u53d1\u73b0\u6ca1\u6709\u4f7f\u7528\u591a\u7ebf\u7a0b\u4f18\u5316\u7684 step0 \u7684\u7528\u65f6\u76f8\u8f83\u4e4b\u524d\u6709\u7740\u660e\u663e\u589e\u52a0\uff0c\u5e45\u5ea6\u8fbe\u5230\u4e86\u5355\u7ebf\u7a0b\u65f6\u7684\u4e24\u500d\u3002\u706b\u7130\u56fe\u4e0a\u770b\uff0cstep0 \u671f\u95f4\u8c03\u7528\u7684\u6bcf\u4e2a\u51fd\u6570\u7528\u65f6\u589e\u957f\u5e45\u5ea6\u5927\u81f4\u76f8\u5f53\u3002<br /><br />\u5355\u7ebf\u7a0b\u65f6\uff0c\u7528\u65f6\u5206\u522b\u4e3a\uff1at0=2s, t1=5.58s, t2=10s \u591a\u7ebf\u7a0b\u65f6\uff0c\u7528\u65f6\u4e3a\uff1at0=3.97s t1=9.3s t2=10.4s<br /><br />\u697c\u4e3b\u73b0\u5728\u4e0d\u7406\u89e3\u7684\u662f\uff0cstep0 \u770b\u8d77\u6765\u548c\u6211\u7684\u591a\u7ebf\u7a0b\u4f18\u5316\u6ca1\u6709\u4efb\u4f55\u5173\u7cfb\uff0c\u5728 step0 \u8fd0\u884c\u65f6\uff0c\u4e09\u4e2a\u540e\u53f0\u7ebf\u7a0b\u5e94\u8be5\u90fd\u5728\u88ab condition_variable \u963b\u585e\u3002\u4e3a\u4ec0\u4e48\u7528\u65f6\u4f1a\u589e\u52a0\u5462\uff1f<br />\u697c\u4e3b\u8fd0\u884c\u73af\u5883\u4e3a\u591a\u4eba\u5171\u7528\u7684 linux \u670d\u52a1\u5668\uff0c100 \u591a\u4e2a\u7a7a\u95f2\u6838\u5fc3\uff0c\u5f00\u4e09\u4e2a\u540e\u53f0\u7ebf\u7a0b\u5e94\u8be5\u4e0d\u4f1a\u6709\u4ec0\u4e48\u5f71\u54cd\u3002"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/cookgo", 
        "name": "cookgo", 
        "avatar": "https://cdn.v2ex.com/avatar/bfc2/af4e/424647_large.png?m=1677747623"
      }, 
      "url": "https://www.v2ex.com/t/1170624", 
      "title": "2026 \u5e74\u627e C++\u7684\u5f00\u53d1\u5de5\u4f5c\uff0c\u5e94\u8be5\u5b66\u4e60 C++\u7684\u54ea\u4e2a\u7248\u672c\uff1f", 
      "id": "https://www.v2ex.com/t/1170624", 
      "date_published": "2025-11-05T03:07:26+00:00", 
      "content_html": ""
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/YangJiLei", 
        "name": "YangJiLei", 
        "avatar": "https://cdn.v2ex.com/avatar/99db/a25d/594741_large.png?m=1764035086"
      }, 
      "url": "https://www.v2ex.com/t/1169005", 
      "date_modified": "2025-10-28T13:27:48+00:00", 
      "content_html": "<p>\u6211\u73b0\u5728\u7814\u4e00\uff0c\u6b63\u5728\u5b66\u4e60 \u5206\u5e03\u5f0f\u7cfb\u7edf\uff0c\u6bd5\u4e1a\u540e\u51c6\u5907\u627e\u5de5\u4f5c\u3002\u5b66\u6821\u6765\u6821\u62db\u7684\u4f01\u4e1a\u91cc\uff0c\u5927\u5382\u90fd\u6709\u3002</p>\n<p>\u6211\u60f3\u8bf7\u6559\u5927\u5bb6\u4e00\u4e2a\u95ee\u9898\uff1a</p>\n<pre><code>1. \u662f\u53ea\u8981\u628a\u5f00\u6e90\u9879\u76ee\u7684\u7ec6\u8282\u5403\u900f\u3001\u4f1a\u8c03\u5e93\u5c31\u591f\u4e86\u5417\uff0c\n\n2. \u8fd8\u662f\u8fd8\u9700\u8981\u6709\u81ea\u5df1\u80fd\u4ece\u96f6\u624b\u5199\u5e76\u642d\u5efa\u5206\u5e03\u5f0f\u7cfb\u7edf\u7684\u80fd\u529b \u624d\u591f\u7ade\u4e89\u529b\uff1f\n</code></pre>\n<p>\u60f3\u542c\u542c\u5927\u5bb6\u7684\u7ecf\u9a8c\u548c\u5efa\u8bae\u3002\n\u5982\u679c\u6709\u6700\u8fd1\u5728\u66f4\u65b0\u7684\u4e2d\u5c0f\u5f00\u6e90\u7684\u9879\u76ee\uff0c\u5e0c\u671b\u5927\u5bb6\u63a8\u8350\u7ed9\u6211\u3002</p>\n", 
      "date_published": "2025-10-28T13:26:40+00:00", 
      "title": "\u5206\u5e03\u5f0f\u7cfb\u7edf", 
      "id": "https://www.v2ex.com/t/1169005"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/liuidetmks", 
        "name": "liuidetmks", 
        "avatar": "https://cdn.v2ex.com/avatar/e540/71e7/220603_large.png?m=1774868401"
      }, 
      "url": "https://www.v2ex.com/t/1164518", 
      "date_modified": "2025-10-11T23:13:07+00:00", 
      "content_html": "<p>\u5728\u9879\u76ee\u4e2d\uff0c\u7528\u533f\u540d\u7ed3\u6784\u4f53\u7684\u5730\u5740\u4f5c\u4e3a\u5e38\u91cf\u6765\u6807\u8bc6\u4e0d\u540c\u4e1a\u52a1\u7c7b\u578b\uff08\u4f8b\u5982 A \u3001B \u3001C \u3001D\u2026\u2026\uff09\uff0c </p>\n<p>\u8fd9\u6837\u505a\u7684\u76ee\u7684\u662f\u5f7b\u5e95\u907f\u514d\u9b54\u672f\u6570\u5b57\uff08 magic number \uff09\uff0c\u5e76\u4e14\u5e0c\u671b\u5728\u903b\u8f91\u5224\u65ad\u4e2d\u76f4\u63a5\u901a\u8fc7\u6307\u9488\u6bd4\u8f83\u3002</p>\n<p>\u4ee3\u7801 h \u6587\u4ef6</p>\n<pre><code>typedef struct __BizType *BizTypeRef;\n\n// \u5bf9\u5916\u66b4\u9732\u7684\u5e38\u91cf\u58f0\u660e\nextern const BizTypeRef kBizTypeA;\nextern const BizTypeRef kBizTypeB;\nextern const BizTypeRef kBizTypeC;\nextern const BizTypeRef kBizTypeD;\n\n</code></pre>\n<p>\u5b9e\u73b0\u6587\u4ef6</p>\n<pre><code>\n// \u5b9a\u4e49\u7ed3\u6784\u4f53\nstruct __BizType {\n    int value;\n};\n\n// \u5b9a\u4e49\u5e38\u91cf\u6307\u9488\nconst BizTypeRef kBizTypeA = &amp;(const struct __BizType){ .value = 1 };\nconst BizTypeRef kBizTypeB = &amp;(const struct __BizType){ .value = 2 };\nconst BizTypeRef kBizTypeC = &amp;(const struct __BizType){ .value = 3 };\nconst BizTypeRef kBizTypeD = &amp;(const struct __BizType){ .value = 4 };\n</code></pre>\n<p>\u4f7f\u7528</p>\n<pre><code>// \u4f7f\u7528\u793a\u4f8b\nvoid handleBiz(BizTypeRef type) {\n    if (type == kBizTypeA) {\n        // \u5904\u7406\u4e1a\u52a1 A\n    } else if (type == kBizTypeB) {\n        // \u5904\u7406\u4e1a\u52a1 B\n    }\n}\n</code></pre>\n", 
      "date_published": "2025-10-11T09:43:01+00:00", 
      "title": "\u4f7f\u7528\u533f\u540d\u7ed3\u6784\u4f53\u6307\u9488\u4f5c\u4e3a\u5e38\u91cf\u6765\u675c\u7edd\u9b54\u6570\uff0c\u662f\u5426\u5408\u7406/\u503c\u5f97\uff1f", 
      "id": "https://www.v2ex.com/t/1164518"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/gfbts", 
        "name": "gfbts", 
        "avatar": "https://cdn.v2ex.com/gravatar/1e33fd11b19f7ea21dfb2ec34f50c4b0?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1163273", 
      "date_modified": "2025-10-05T05:37:19+00:00", 
      "content_html": "<p>\u6bd4\u5982\u7edf\u8ba1\u4f7f\u7528\u9891\u7387\u5e76\u6392\u540d</p>\n", 
      "date_published": "2025-10-03T12:09:45+00:00", 
      "title": "\u6709\u6ca1\u6709\u4ec0\u4e48\u5de5\u5177\u53ef\u4ee5\u7edf\u8ba1 C++\u9879\u76ee\u91cc\u6807\u8bc6\u7b26\u7684\u4f7f\u7528\u60c5\u51b5\uff1f", 
      "id": "https://www.v2ex.com/t/1163273"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/ksc010", 
        "name": "ksc010", 
        "avatar": "https://cdn.v2ex.com/avatar/e420/4b5b/37397_large.png?m=1774703771"
      }, 
      "url": "https://www.v2ex.com/t/1159892", 
      "date_modified": "2025-09-17T07:54:29+00:00", 
      "content_html": "\u6bd4\u5982 void Function_Name();", 
      "date_published": "2025-09-17T04:06:54+00:00", 
      "title": "\u770b\u5230\u4e00\u4e9b C++ \u6216\u8005 C#\u9879\u76ee \u9a7c\u5cf0\u548c\u4e0b\u5212\u7ebf\u4e00\u5757\u7528\uff0c\u4e3a\u5565\u6ce5\uff1f", 
      "id": "https://www.v2ex.com/t/1159892"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Ainokiseki", 
        "name": "Ainokiseki", 
        "avatar": "https://cdn.v2ex.com/gravatar/9ee45647f863b0aef5fdb5fd3966321e?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1157377", 
      "title": "[\u6c42\u52a9] Linux \u7cfb\u7edf\u4e0b\u52a8\u6001\u5e93\u5378\u8f7d\u540e\u5168\u5c40\u53d8\u91cf\u672a\u91cd\u7f6e\u7684\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1157377", 
      "date_published": "2025-09-05T10:31:04+00:00", 
      "content_html": "\u9047\u5230\u4e00\u4e2a\u5934\u75bc\u7684\u95ee\u9898\uff0c\u5144\u5f1f\u90e8\u95e8\u9700\u8981\u8c03\u7528\u6211\u7684\u4ee3\u7801\uff0c<a target=\"_blank\" href=\"http://\u6211\u628a\u4ee3\u7801\u5c01\u88c5\u6210\u4e86.so\" rel=\"nofollow noopener\">\u6211\u628a\u4ee3\u7801\u5c01\u88c5\u6210\u4e86.so</a> \u52a8\u6001\u5e93\u7ed9\u4ed6\u4eec\u4f7f\u7528\u3002\u4ed6\u4eec\u4f1a\u5199\u5f88\u591a\u6d4b\u8bd5 case \uff0c\u6bcf\u4e2a case \u4f9d\u6b21\u8fd0\u884c\uff0c\u8fd0\u884c\u65f6\u9996\u5148\u4f7f\u7528 dlopen \u88c5\u8f7d\u6211\u7684\u5e93\uff0c\u8fd0\u884c\u5b8c\u6bd5\u540e\u4f7f\u7528 dlclose \u5378\u8f7d\u3002\u4e0b\u4e00\u4e2a case \u91cd\u65b0\u4f7f\u7528 dlopen \u88c5\u8f7d\u3002<br /><br />\u76ee\u524d\u9047\u5230\u7684\u95ee\u9898\u662f\uff0c\u5728\u7b2c\u4e8c\u6b21 dlopen \u4e4b\u540e\uff0c\u6211\u7684\u5e93\u91cc\u7684\u5168\u5c40\u53d8\u91cf\u7684\u503c\u4ecd\u7136\u662f\u4e0a\u4e00\u6b21\u8fd0\u884c\u4e4b\u540e\u5269\u4e0b\u7684\u3002\u800c\u6211\u671f\u671b\u5728 dlclose \u4e4b\u540e\uff0c\u5168\u5c40\u53d8\u91cf\u4eec\u5e94\u8be5\u88ab\u6790\u6784\u6389\uff0c\u5728 dlopen \u4e4b\u540e\u91cd\u65b0\u6784\u9020\u4ee5\u53ca\u521d\u59cb\u5316\u3002<br /><br />\u6211\u8be2\u95ee AI \u5f97\u5230\u7684\u4fe1\u606f\u662f\uff0cdlclose \u4e4b\u540e\u5982\u679c\u5f15\u7528\u8ba1\u6570\u4e3a 0 \uff0c\u90a3\u4e48\u4f1a\u8fdb\u884c\u6211\u671f\u671b\u7684\u6790\u6784\u8fc7\u7a0b\u3002\u4f46\u662f\u6ca1\u6709\u76f4\u63a5\u624b\u6bb5\u80fd\u67e5\u770b\u5f15\u7528\u8ba1\u6570\u3002\u53ef\u80fd\u5bfc\u81f4\u5f15\u7528\u8ba1\u6570\u4e0d\u4e3a 0 \u7684\u539f\u56e0\u5305\u62ec\uff1a\u591a\u6b21 dlopen \u53ea\u6709\u4e00\u6b21 dlclose \uff1b\u5f15\u7528\u7684\u5176\u4ed6\u52a8\u6001\u5e93\u4f9d\u8d56\u4e86\u6211\u7684\u5e93\u3002\u5176\u4e2d\u7b2c\u4e00\u6761\u6211\u8ba4\u4e3a\u4e0d\u53ef\u80fd\uff0c\u6211\u901a\u8fc7\u65ad\u70b9\u548c\u65e5\u5fd7\u80fd\u786e\u4fe1\u53ea\u6709\u4e00\u6b21 dlopen \u548c\u4e00\u6b21 dlclose \u3002\u7b2c\u4e8c\u6761\u4e5f\u4e0d\u53ef\u80fd\uff0c\u6211\u67e5\u770b\u4e86\u6240\u6709\u52a8\u6001\u5e93\u7684\u4f9d\u8d56\u5e93\uff0c\u6ca1\u6709\u4efb\u4f55\u4e00\u4e2a\u4f9d\u8d56\u6211\u7684\u5e93\u3002<br /><br />\u6211\u5728 dlclose \u548c dlopen \u7684\u65f6\u5019\u5747\u8fdb\u884c\u4e86\u68c0\u67e5\uff0c\u4e24\u6b21 dlopen \u548c\u4e00\u6b21 dlclose \u90fd\u662f\u6210\u529f\u7684\uff0c\u6ca1\u6709\u9519\u8bef\u4fe1\u606f\u3002<br /><br />\u6c42\u95ee\u6709\u6ca1\u6709\u5927\u4f6c\u9047\u5230\u8fc7\u7c7b\u4f3c\u7684\u60c5\u51b5\uff0c\u8981\u88ab\u641e\u75af\u4e86\u3002\u3002\u3002"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/ChainLock", 
        "name": "ChainLock", 
        "avatar": "https://cdn.v2ex.com/avatar/c97f/842f/426828_large.png?m=1757037316"
      }, 
      "url": "https://www.v2ex.com/t/1157237", 
      "title": "\u4ea4\u53c9\u7f16\u8bd1 asop android adb \u6700\u65b0\u7248\u7684\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1157237", 
      "date_published": "2025-09-05T01:56:10+00:00", 
      "content_html": "<p>\u76ee\u6807\uff1a\u4ea4\u53c9\u7f16\u8bd1 android adb,\u653e\u5230\u5d4c\u5165\u5f0f\u677f\u5b50\u4e0a\u9762\u6267\u884c</p>\n<p>android \u6e90\u7801\u5df2\u7ecf\u4e0b\u8f7d\u597d</p>\n<pre><code>mkdir -p ~/.bin\nPATH=\"${HOME}/.bin:${PATH}\"\ncurl https://storage.googleapis.com/git-repo-downloads/repo &gt; ~/.bin/repo\nchmod a+rx ~/.bin/repo\n\nrepo init --partial-clone -b android-latest-release -u https://android.googlesource.com/platform/manifest\n\nrepo sync -c -j8\n</code></pre>\n<p>packages/modules/adb \u76ee\u5f55\u4e0b\u9762\u65b0\u7248\u7684 asop \u5df2\u7ecf\u6ca1\u6709 <a href=\"http://Android.mk\" rel=\"nofollow\">Android.mk</a>,\u53ea\u6709 Android.bp</p>\n<p>\u5df2\u7ecf\u8ddf chatgpt \u5bf9\u7ebf\u4e86 3 \u5929\uff0c\u4f9d\u65e7\u6ca1\u6709\u641e\u51fa\u6765\uff0c\u671b\u641e\u8fc7\u6765\u7684\u5927\u4f6c\u6307\u70b9\u4e00\u4e0b\uff0c\u5fc5\u987b\u5f97\u7528\u65b0\u7248\u6765\u7f16\u8bd1\uff0c\u6211\u5728 csdn \u53c2\u8003\u4e86\u8fd9\u7f16\u6587\u7ae0 aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rpc2FwcGVhcnNfbmljay9hcnRpY2xlL2RldGFpbHMvMTE3MDMxNzQz</p>\n<p>\u53ef\u4ee5\u4ea4\u53c9\u7f16\u8bd1\u6210\u529f\uff0c\u7248\u672c\u662f 1.0.31,\u6700\u65b0\u7248\u672c\u5df2\u7ecf\u662f 1.0.41,\u5c06\u7f16\u8bd1\u597d adb \u653e\u5230\u677f\u5b50\u4e0a\u9762\u8fd0\u884c\u65f6</p>\n<pre><code>adb connect 128.0.12.109:5555\nconnected to 128.0.12.109:5555\n\nadb devices\nList of devices attached\n128.0.12.109:5555  offline  \u4e00\u76f4\u662f\u79bb\u7ebf\u72b6\u6001\uff0c\u5bfc\u81f4\u4e0d\u53ef\u7528\n</code></pre>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/ck125s", 
        "name": "ck125s", 
        "avatar": "https://cdn.v2ex.com/gravatar/75ec3aeaed5ccc0943b05d1b9b36fa6e?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1157005", 
      "title": "[\u6709\u507f] \u5c0f\u767d, Windows UI Automation TextPattern \u68c0\u6d4b\u95ee\u9898\u6c42\u52a9", 
      "id": "https://www.v2ex.com/t/1157005", 
      "date_published": "2025-09-04T02:40:17+00:00", 
      "content_html": "<p>\u5404\u4f4d V \u53cb\uff0c\u6700\u8fd1\u5728\u7528 UI Automation (UIA) \u65f6\u9047\u5230\u4e86\u4e00\u4e2a\u5f88\u5947\u602a\u7684\u95ee\u9898\uff0c\u5361\u4e86\u597d\u51e0\u5929\u4e86\u3002</p>\n<p>\u82e5\u65b9\u6cd5\u6709\u6548\u611f\u8c22\ud83d\ude4f200RMB</p>\n<p>\u76ee\u6807: \u83b7\u53d6\u8bb0\u4e8b\u672c\uff08 Notepad \uff09\u7f16\u8f91\u6846\u7684 TextPattern \u3002</p>\n<h2>\u73b0\u8c61\uff1a</h2>\n<p>\u6211\u7528 Accessibility Insights for Windows \u53bb\u770b\uff0c\u660e\u660e\u786e\u786e\u663e\u793a\u8bb0\u4e8b\u672c\u7684\u7f16\u8f91\u6846\u662f\u652f\u6301 TextPattern \u7684\u3002</p>\n<p><img alt=\"Accessibility Insights for windows\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://i.imgur.com/QzRHTkH.jpeg\"/></p>\n<h2>\u95ee\u9898\uff1a</h2>\n<p>\u6211\u81ea\u5df1\u7684\u4ee3\u7801\uff0c\u65e0\u8bba\u7528\u54ea\u79cd\u65b9\u5f0f\uff0c\u90fd\u68c0\u6d4b\u4e0d\u5230 TextPattern \u3002</p>\n<p>\u6211\u8bd5\u8fc7\u7684\u4e24\u79cd\u65b9\u6cd5\uff1a</p>\n<h3>C++ \u539f\u751f COM \u63a5\u53e3\uff1a</h3>\n<p>\u901a\u8fc7 GetFocusedElement \u62ff\u5230\u5143\u7d20\uff0c\u7136\u540e GetCurrentPattern(TextPattern.Pattern)\uff0c\u7ed3\u679c\u662f\u62ff\u4e0d\u5230\u3002</p>\n<h3>C# + Axe.Windows (Accessibility Insights \u6838\u5fc3\u5e93):</h3>\n<p>\u6211\u4ee5\u4e3a\u662f\u6211\u7684\u59ff\u52bf\u4e0d\u5bf9\uff0c[\u627e\u5230\u6e90\u7801]( GitHub - microsoft/accessibility-insights-windows: Accessibility Insights for Windows)\uff0c\u5f15\u7528 Axe.Windows \u5e93\uff0c\u5b8c\u5168\u6a21\u62df AI \u7684\u5de5\u4f5c\u6d41\u7a0b\uff0c\u8c03\u7528 PopulateAllPropertiesWithLiveData() \u7b49\u65b9\u6cd5\uff0c\u7ed3\u679c\u4f9d\u7136\u68c0\u6d4b\u4e0d\u5230 TextPattern \u3002</p>\n<h2>\u5df2\u6392\u9664\u7684\u5e38\u89c4\u95ee\u9898\uff1a</h2>\n<p>UIAccess \u6743\u9650\u3001COM \u7ebf\u7a0b\u6a21\u578b\uff08 STA \uff09\u3001\u5143\u7d20\u53e5\u67c4\u6709\u6548\u6027\u7b49\u90fd\u68c0\u67e5\u8fc7\u4e86\uff0c\u6ca1\u95ee\u9898\u3002\u5176\u4ed6 Pattern \u6bd4\u5982 ValuePattern \u662f\u53ef\u4ee5\u6b63\u5e38\u83b7\u53d6\u7684\u3002</p>\n<h2>\u6838\u5fc3\u7591\u95ee\uff1a</h2>\n<p>Accessibility Insights \u5230\u5e95\u7528\u4e86\u4ec0\u4e48\u9b54\u6cd5\uff1f\n\u4e3a\u4ec0\u4e48\u5b83\u80fd\u770b\u5230 TextPattern \uff0c\u800c\u6211\u76f4\u63a5\u8c03\u7528 UIA API \u6216\u8005\u7528\u5b83\u7684\u6838\u5fc3\u5e93\u90fd\u590d\u73b0\u4e0d\u4e86\uff1f\u662f\u4e0d\u662f\u9700\u8981\u4ec0\u4e48\u7279\u6b8a\u7684\u521d\u59cb\u5316\u6b65\u9aa4\uff0c\u6216\u8005 Windows \u5bf9\u8bb0\u4e8b\u672c\u8fd9\u4e2a\u201c\u4eb2\u513f\u5b50\u201d\u6709\u4ec0\u4e48\u7279\u6b8a\u7684\u5904\u7406\uff1f\n\u6709\u5927\u4f6c\u4e86\u89e3\u5176\u4e2d\u673a\u5236\u5417\uff1f\u6216\u8005\u6709\u5176\u4ed6\u8c03\u8bd5\u601d\u8def\u4e5f\u884c\u3002</p>\n<hr/>\n<p>\u5982\u679c\u80fd\u63d0\u4f9b\u89e3\u51b3\u65b9\u6848\u6216\u5173\u952e\u601d\u8def\uff0c\u53ef\u6709\u507f\u6307\u5bfc\uff0c\u611f\u8c22\uff01</p>\n<p>\u5fae\u4fe1\uff1aDelightpl</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/xlpxx", 
        "name": "xlpxx", 
        "avatar": "https://cdn.v2ex.com/gravatar/ee2a11b4c319da20e525ec2daa204a98?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1156174", 
      "title": "\u5c0f\u767d\u95ee\u4e2a vcpkg \u76f8\u5173\u7684\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1156174", 
      "date_published": "2025-09-01T02:08:22+00:00", 
      "content_html": "<p>\u6211\u7528 vcpkg \u7684\u6e05\u5355\u6a21\u5f0f\u7ba1\u7406\u9879\u76ee\u4f9d\u8d56\u7684\u4e09\u65b9\u5e93\uff08\u4e3b\u8981\u662f opencv \uff09\uff0c\u5f53\u6211\u914d\u7f6e\u597d\u540e\uff0c\u9879\u76ee\u4e5f\u80fd\u7f16\u8fc7\u3002\u4f46\u662f\u8fd0\u884c\u7684\u65f6\u5019\u603b\u662f\u62a5\u7f3a cv \u7684 dll \uff0c\u4f46\u662f\u4e4b\u524d\u662f\u6ca1\u6709\u8fd9\u4e2a\u95ee\u9898\u7684\uff0ccmakelist \u6587\u4ef6\u4e5f\u6ca1\u6709\u6539\u8fc7\uff0c\u60f3\u77e5\u9053\u8fd9\u4e2a\u5751\u5230\u5e95\u5728\u54ea\u91cc</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/zcion", 
        "name": "zcion", 
        "avatar": "https://cdn.v2ex.com/gravatar/01be0b4e4d10c4d12ed83ef0a87bcebd?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1152503", 
      "title": "\u8bb0\u5f55\u4e00\u6b21\u8e29\u5751\u8fc7\u7a0b\uff08clion + cmake + vcpkg\uff09", 
      "id": "https://www.v2ex.com/t/1152503", 
      "date_published": "2025-08-14T22:50:15+00:00", 
      "content_html": "<p>\u9996\u5148\u7ed3\u8bba\u653e\u8fd9\u91cc\uff1a\u7f16\u5199 cmake \u6587\u4ef6\u65f6\uff0c<code>project(xxx)</code> \u653e\u5728\u8d8a\u540e\u8fb9\u8d8a\u597d\uff0c\u907f\u514d\u5728\u5b83\u4e4b\u540e\u5b9a\u4e49\u548c\u6784\u5efa\u76f8\u5173\u7684\u5b8f\u53d8\u91cf</p>\n<p>\u597d\u7684\uff0c\u4e0b\u8fb9\u662f\u8e29\u5751\u7ecf\u5386\uff1a\n\u697c\u4e3b\u5728\u5199\u4e00\u4e2a\u7a0b\u5e8f\u65f6\uff0c\u7a81\u53d1\u5947\u60f3\u7684\u60f3\u5206\u522b\u4f7f\u7528 vs \u5de5\u5177\u94fe\u548c mingw \u5de5\u5177\u94fe\u8dd1\u4e0b\u4ee3\u7801\uff0c\u6240\u9700\u8981\u7684\u5e93\u6587\u4ef6\u90fd\u662f\u7528 <code>vcpkg</code> \u4e0b\u8f7d\u7684\u3002</p>\n<p>\u62ff <code>CMAKE_TOOLCHAIN_FILE</code> \u4e3e\u4f8b\uff0c\u4f7f\u7528 <code>vcpkg</code> + <code>cmake</code>\uff0c\u5c31\u9700\u8981\u5b9a\u4e49\u8fd9\u4e2a\u503c\uff08\u6307\u660e\u4f60\u7684 <code>vcpkg.cmake</code> \u653e\u5728\u54ea\u4e2a\u8def\u5f84\u4e0b\uff0c\u901a\u5e38\u662f <code>xxx/vcpkg/scripts/buildsystems/vcpkg.cmake</code>\uff09\u3002\u8981\u5b9a\u4e49\u8fd9\u4e2a\u503c\uff0c\u8981\u4e48\u5c31\u662f\u5728\u6267\u884c cmake \u6784\u5efa\u547d\u4ee4\u65f6\u52a0\u4e0a <code>-DCMAKE_TOOLCHAIN_FILE</code> \u53c2\u6570\uff0c\u8981\u4e48\u5c31\u662f\u76f4\u63a5\u5728 cmake \u6587\u4ef6\u4e2d\u6307\u5b9a\u3002\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u5f88\u597d\u7406\u89e3\uff0c\u76f4\u63a5\u5728 cmake \u6587\u4ef6\u5b9a\u4e49\u5c31\u884c\uff08 clion \u5728\u6784\u5efa\u65f6\u4f1a\u5c06\u5176\u6dfb\u52a0\u8fdb <code>cache variable</code>\uff09\uff0c\u800c\u7b2c\u4e00\u79cd\uff0c\u5982\u679c\u662f\u5728 clion \u4e2d\uff0c\u4f60\u5c31\u9700\u8981\u5728\u5982\u4e0b\u56fe\u4f4d\u7f6e\u6307\u5b9a\uff1a</p>\n<img class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://i.ooxx.ooo/i/NWVjM.png\"/>\n<p>\u90a3\u4e48\u95ee\u9898\u5c31\u6765\u4e86\uff0c\u7531\u4e8e\u697c\u4e3b\u9700\u8981\u5206\u522b\u4f7f\u7528 <code>msvc</code> \u548c <code>gcc</code> \u7f16\u8bd1\uff0c\u6240\u4ee5\u9700\u8981\u5b9a\u4e49 <code>VCPKG_TARGET_TRIPLET</code> \u6765\u9009\u7528 <code>vcpkg</code> \u4e2d\u5e93\u6587\u4ef6\u7684 triplet \uff0c\u7b2c\u4e00\u6b21\u7528 msvc \u7f16\u8bd1\u9879\u76ee\uff0c\u6ca1\u6709\u4efb\u4f55\u95ee\u9898\uff0c\u4f46\u6362\u6210 mingw \u540e\u5c31\u51fa\u73b0\u83ab\u540d\u5176\u5999\u7684\u95ee\u9898\uff08\u4f8b\u5982 cmake \u6784\u5efa\u4e0d\u6210\u529f\uff0c\u6784\u5efa\u6210\u529f\u4f46\u94fe\u63a5\u65f6\u627e\u4e0d\u5230\u5bf9\u5e94\u7684 lib \uff09\u3002\u5728\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u6392\u67e5\u53d1\u73b0\uff0c\u867d\u7136\u6211\u5728 cmake \u4e2d\u6307\u5b9a\u4e86 <code>set(VCPKG_TARGET_TRIPLET x64-mingw-dynamic)</code>\uff0c\u4f46 clion \u7684 <code>cache variable</code> \u4e2d\u7684 <code>VCPKG_TARGET_TRIPLET</code> \u7684\u503c\u96f7\u6253\u4e0d\u52a8\u7684\u4e3a <code>x64-windows</code>\uff08\u56e0\u4e3a\u5148\u7528\u7684\u662f vs \u5de5\u5177\u94fe\u7684\uff0c\u6240\u4ee5 clion \u4e00\u76f4\u7528\u7684\u662f\u7f13\u5b58\u7684\u503c\uff09\u3002\u5728\u7ecf\u8fc7\u5f88\u957f\u4e00\u6bb5\u65f6\u95f4\u7684\u6298\u78e8\u540e\uff0c\u6211\u7a81\u53d1\u5947\u60f3\u7684\u5c06\u6240\u6709\u8bbe\u8ba1 <code>vcpkg</code> \u7684\u5b8f\u5b9a\u4e49\u63d0\u5230\u4e86 cmake \u6587\u4ef6\u7684\u6700\u524d\u8fb9\uff0c\u7136\u540e\u95ee\u9898\u5c31\u89e3\u51b3\u4e86\u3002</p>\n<pre><code class=\"language-cmake\"># \u4ece\u539f\u5148\u7684\u8fd9\u6837\ncmake_minimum_required(VERSION 3.30)\nproject(myproject)\nset(CMAKE_TOOLCHAIN_FILE \"D:/development-tool/vcpkg/scripts/buildsystems/vcpkg.cmake\")\nset(VCPKG_TARGET_TRIPLET x64-mingw-dynamic)\n# ...\n\n# \u53d8\u6210\u8fd9\u6837\ncmake_minimum_required(VERSION 3.30)\nset(CMAKE_TOOLCHAIN_FILE \"D:/development-tool/vcpkg/scripts/buildsystems/vcpkg.cmake\")\nset(VCPKG_TARGET_TRIPLET x64-mingw-dynamic)\n# ...\nproject(myproject)\n# ...\n</code></pre>\n<p>\u6700\u540e\u60f3\u901a\u4e86\uff0c\u5728 <code>project()</code> \u524d\u5b9a\u4e49\u5b8f\uff0c\u8fd9\u4e9b\u5b8f\u5c31\u80fd\u591f\u5728\u9879\u76ee\u5728\u6784\u5efa\u524d\u4f7f\u7528\uff0c\u8fd9\u6837 clion \u5c31\u80fd\u591f\u5148\u5199\u5165 <code>cache variable</code>\uff0c\u8fd9\u6837\u5c31\u786e\u4fdd\u9879\u76ee\u6784\u5efa\u7684\u884c\u4e3a\u662f\u6839\u636e cmake \u6587\u4ef6\u4e2d\u6765\u7684\u3002\u53cd\u4e4b\u5728 <code>project()</code> \u540e\u5b9a\u4e49\uff0c\u8fd9\u4e9b\u5b8f\u5c31\u53d8\u4e3a\u5728\u9879\u76ee\u6784\u5efa\u8fc7\u7a0b\u4e2d\u624d\u80fd\u4f7f\u7528\uff0c\u8fd9\u5c31\u5bfc\u81f4\u4e86 clion \u9700\u8981\u5728\u6784\u5efa\u524d\u6307\u5b9a vcpkg \u67d0\u4e9b\u5b8f\u627e\u4e0d\u5230\uff0c\u6240\u4ee5 clion \u7528\u7684\u662f\u7f13\u5b58\u7684\u503c\u3002</p>\n<p>\u76f8\u4fe1\u6709\u4e00\u90e8\u5206\u4eba\u548c\u6211\u4e00\u6837\uff0c\u5728\u5f00\u59cb\u5199 cmake \u65f6\uff0c\u559c\u6b22\u7528\u9ed8\u8ba4\u7684\u6a21\u677f\u6765\u5199\uff0c\u800c\u9ed8\u8ba4\u6a21\u677f\u7684 <code>project()</code> \u53c8\u662f\u6700\u5148\u5199\u7684\uff0c\u7b49\u5230\u9879\u76ee\u9010\u6e10\u7684\u5f00\u53d1\uff0c\u9700\u8981\u5f80 cmake \u4e2d\u5047\u5982\u8d8a\u6765\u8d8a\u591a\u4e1c\u897f\uff0c\u8fd9\u4e9b\u4e1c\u897f\u5f88\u5bb9\u6613\u5c31\u52a0\u5230 <code>project()</code> \u540e\uff0c\u7136\u540e\u4e00\u4e9b\u5728\u6784\u5efa\u524d\u9700\u8981\u7528\u5230\u7684\u5b8f\u65e0\u6cd5\u88ab\u8bc6\u522b\uff0c\u4ece\u800c\u5f15\u53d1\u4e00\u7cfb\u5217\u95ee\u9898\u3002</p>\n<p>\u8fd9\u4e2a\u70b9\u53ef\u80fd\u662f cmake \u5f88\u5e38\u89c4\u7684\u4e00\u4e2a\u70b9\uff0c\u4f46\u5982\u679c\u5ffd\u7565\u4e86\uff0c\u5c31\u53ef\u80fd\u50cf\u6211\u4e00\u6837\uff0c\u5728 google-&gt;ai \u540e\u9677\u5165\u201c\u660e\u660e\u90fd\u662f\u6309\u7167\u8bed\u6cd5\u6765\u7684\uff0c\u600e\u4e48\u6b7b\u6d3b\u5c31\u8dd1\u4e0d\u8d77\u6765\u201d\uff0c\u7136\u540e\u65e0\u80fd\u72c2\u6012\u6570\u4e2a\u5c0f\u65f6\u7684\u60c5\u51b5\u3002</p>\n<p>\u6700\u540e\u518d\u5206\u4eab\u70b9\u5fc3\u5f97\uff0c\u5982\u679c\u4ec0\u4e48\u90fd\u770b\u7740\u6b63\u5e38\uff0c\u4f46\u9879\u76ee\u5c31\u662f\u8dd1\u4e0d\u8d77\u6765\uff0c\u53ef\u4ee5\u770b\u770b <code>cache variable</code> \u4e2d\u7684\u503c\u662f\u5426\u6709\u95ee\u9898</p>\n<img class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://i.ooxx.ooo/i/NzQ1Y.png\"/>"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/zcion", 
        "name": "zcion", 
        "avatar": "https://cdn.v2ex.com/gravatar/01be0b4e4d10c4d12ed83ef0a87bcebd?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1146903", 
      "title": "\u7528\u667a\u80fd\u6307\u9488\u7ba1\u7406 ffmpeg \u4e2d\u7684\u6570\u636e\u7ed3\u6784\u662f\u6709\u5fc5\u8981\u7684\u5417\uff1f", 
      "id": "https://www.v2ex.com/t/1146903", 
      "date_published": "2025-07-22T07:51:47+00:00", 
      "content_html": "<p>ffmpeg \u7684 api \u548c \u6570\u636e\u7ed3\u6784\u90fd\u662f c \u98ce\u683c\uff0c\u5f53\u6211\u5728 c++ \u4e2d\u4f7f\u7528\u5b83\u4eec\u65f6\uff0c\u5f88\u81ea\u7136\u5c31\u60f3\u5230\u7528\u667a\u80fd\u6307\u9488\u53bb\u7ba1\u7406\uff08\u4f8b\u5982 <code>AVFormatContext*</code>\u3001<code>AVCodecContext*</code> \u7b49\uff09\uff0c\u56e0\u4e3a\u53ef\u4ee5\u81ea\u5b9a\u4e49\u5220\u9664\u5668\uff0c\u5c06 ffmpeg \u63d0\u4f9b\u7684 <code>free</code> \u64cd\u4f5c\u653e\u8fdb\u53bb\uff1b\u4f46 ffmpeg \u4e2d\u7684\u4e00\u4e9b api \u9700\u8981\u4f20\u5165\u88f8\u6307\u9488\uff0c\u4e00\u4e9b api \u751a\u81f3\u4f1a\u5728\u5185\u90e8\u76f4\u63a5\u5206\u914d\u7a7a\u95f4\uff0c\u8fd9\u6837\u5b50\u7528\u667a\u80fd\u6307\u9488\u7ba1\u7406\u7684\u60f3\u6cd5\u4f1a\u4e0d\u4f1a\u662f\u6ca1\u6709\u5fc5\u8981\u7684\uff1f</p>\n<p>\u62ff <code>AVFormatContext</code> \u6765\u4e3e\u4f8b\uff0c\u6b63\u5e38\u53ef\u4ee5\u50cf\u8fd9\u6837\u5f97\u5230\u4e00\u4e2a\u88ab\u667a\u80fd\u6307\u9488\u7ba1\u7406\u7684 <code>AVFormatContext</code> \u7ed3\u6784</p>\n<pre><code class=\"language-cpp\">auto deleter = [](AVFormatContext* f){\n    if(f) avformat_free_context(f);\n};\nstd::unique_ptr&lt;AVFormatContext, decltype(deleter)&gt; fmt(avformat_alloc_context(), deleter);\n</code></pre>\n<p>\u4f46\u548c\u5b83\u76f8\u5173\u7684\u4e00\u4e2a api \u662f <code>avformat_open_input</code>\uff0c\u5b83\u7684\u51fd\u6570\u58f0\u660e\u5982\u4e0b\uff08\u4ee5\u4e0b\u8d34\u51fa\u4e00\u90e8\u5206\u5b9e\u73b0\uff09</p>\n<pre><code class=\"language-cpp\">int avformat_open_input(AVFormatContext **ps, const char *url,\n                        const AVInputFormat *fmt, AVDictionary **options);\n                        \n// demux.c \u4e0b avformat_open_input \u7684\u4e00\u90e8\u5206\u5b9e\u73b0\nint avformat_open_input(AVFormatContext **ps, const char *filename,\n                        const AVInputFormat *fmt, AVDictionary **options)\n{\n    ...\n    AVFormatContext *s = *ps;\n    ...\n\n    if (!s &amp;&amp; !(s = avformat_alloc_context()))\n        return AVERROR(ENOMEM);\n    ...\n}\n</code></pre>\n<p>\u53ef\u4ee5\u770b\u5230 <code>avformat_open_input</code> \u9700\u8981\u4e00\u4e2a\u4e8c\u7ea7\u6307\u9488\uff0c\u6240\u4ee5\u9700\u8981\u76f4\u63a5\u4f20\u5165\u88f8\u6307\u9488\u3002\u5982\u679c\u60f3\u8981\u5c06\u4e00\u4e2a\u521d\u59cb\u5316\u7684 <code>unique_ptr&lt;AVFormatContext&gt;</code> \u642d\u914d <code>avformat_open_input</code> \u4f7f\u7528\uff0c\u5c31\u9700\u8981\u50cf\u8fd9\u6837\uff08\u7f51\u4e0a\u770b\u5230\u7684\u505a\u6cd5\uff09</p>\n<pre><code class=\"language-cpp\">auto deleter = [](AVFormatContext* f){\n    if(f) avformat_free_context(f);\n};\nstd::unique_ptr&lt;AVFormatContext, decltype(deleter)&gt; fmt(avformat_alloc_context(), deleter);\n\nauto tmp = fmt.get();\n\navformat_open_input(&amp;tmp, ...);\n</code></pre>\n<p>\u5230\u8fd9\u91cc\u6211\u5c31\u5f00\u59cb\u6000\u7591\u7528 <code>unique_ptr</code> \u7ba1\u7406 <code>AVFormatContext</code> \u7684\u610f\u4e49\u4e86\uff0c\u4e0d\u8fc7\u4ee5\u4e0a\u8fd9\u4e2a\u4f8b\u5b50\u8fd8\u597d\uff0c\u53ea\u662f\u89c2\u611f\u4e0a\u6ca1\u90a3\u4e48\u4f18\u96c5\u3002\u4f46\u4ee5\u4e0b\u7684\u4f8b\u5b50\u8ba9\u6211\u8d28\u7591\u7528\u667a\u80fd\u6307\u9488\u505a\u7ba1\u7406\u7684\u5fc5\u8981\u3002</p>\n<p><code>AVFormatContext</code> \u8fd8\u6709\u4e00\u4e2a\u76f8\u5173\u7684 api \u662f <code>avformat_alloc_output_context2</code>\uff0c\u4ee5\u4e0b\u662f\u51fd\u6570\u58f0\u660e\u548c\u90e8\u5206\u5b9e\u73b0\uff1a</p>\n<pre><code class=\"language-cpp\">int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat,\n                                   const char *format_name, const char *filename);\n                                   \n                                   \nint avformat_alloc_output_context2(AVFormatContext **avctx, const AVOutputFormat *oformat,\n                                   const char *format, const char *filename)\n{\n    AVFormatContext *s = avformat_alloc_context();\n    int ret = 0;\n\n    *avctx = NULL;\n    ...\n    *avctx = s;\n}\n</code></pre>\n<p>\u53ef\u4ee5\u770b\u5230\uff0c<code>avformat_alloc_output_context2</code> \u540c\u6837\u9700\u8981\u4f20\u5165\u4e8c\u7ea7\u6307\u9488\uff0c\u4f46\u4e0e <code>avformat_open_input</code> \u7684\u533a\u522b\u5728\u4e8e\uff0c\u5b83\u5185\u90e8\u76f4\u63a5\u5c06 <code>*avctx = NULL</code>\uff0c\u5e76\u6ca1\u6709\u5224\u65ad\u5176\u662f\u5426\u4e3a\u7a7a\uff0c\u540c\u65f6\u8fd8\u5c06\u5206\u914d\u4e86\u65b0\u7684\u5185\u5b58\u5730\u5740\u7ed9 <code>avctx</code>\uff0c\u8fd9\u4e5f\u5c31\u610f\u5473\u7740\u4ee5\u4e0b\u7684\u64cd\u4f5c\u4f1a\u9020\u6210\u5185\u5b58\u6cc4\u6f0f\uff1a</p>\n<pre><code class=\"language-cpp\">auto deleter = [](AVFormatContext* f){\n    if(f) avformat_free_context(f);\n};\nstd::unique_ptr&lt;AVFormatContext, decltype(deleter)&gt; fmt(avformat_alloc_context(), deleter);\n\nauto tmp = fmt.get();\n\navformat_alloc_output_context2(&amp;tmp, ...);\n</code></pre>\n<p>\u81f3\u6b64\u8ba9\u6211\u4ea7\u751f\u7528\u667a\u80fd\u6307\u9488\u7ba1\u7406 ffmpeg \u6570\u636e\u7ed3\u6784\u7684\u5fc5\u8981\u6027\uff0c\u6709\u6ca1\u6709\u5927\u4f6c\u6765\u89e3\u7b54\u4e00\u4e0b\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/BlackSnow", 
        "name": "BlackSnow", 
        "avatar": "https://cdn.v2ex.com/avatar/077f/9542/682408_large.png?m=1724034304"
      }, 
      "url": "https://www.v2ex.com/t/1144033", 
      "title": "\u5b9a\u4f4d\u91cd\u8f7d\u7684\u63d2\u4ef6\u6216\u8005 IDE", 
      "id": "https://www.v2ex.com/t/1144033", 
      "date_published": "2025-07-09T08:16:27+00:00", 
      "content_html": "<p>\u6c42\u52a9 V \u53cb\u4eec\uff0c\u662f\u5426\u6709\u90a3\u79cd\u80fd\u591f\u8fc7\u6ee4\u5176\u4ed6\u91cd\u8f7d\u51fd\u6570\uff0c\u76f4\u63a5\u5b9a\u4f4d\u5230\u5177\u4f53\u51fd\u6570\u5b9a\u4e49\u7684\u5de5\u5177\u6216\u8005\u6280\u5de7</p>\n<p>\u53ea\u5199\u8fc7\u4e00\u70b9 C \uff0c\u76ee\u524d\u4f7f\u7528 VSCODE \uff08 C++\uff09 + GCC \uff0c\u6bcf\u6b21\u67e5\u770b\u51fd\u6570\u5b9a\u4e49\u7528\u81ea\u5e26\u7684 definition \u4f1a\u8df3\u51fa\u6240\u6709\u91cd\u8f7d\uff0c\u670b\u53cb\u63a8\u8350\u7684\u662f source insight \u6216\u8005 visual studio + VC</p>\n<p>\u4f46\u662f\u7531\u4e8e\u4e0d\u662f\u91cd\u5ea6\u4f7f\u7528\uff0c\u53ea\u662f\u8ddf\u505a\u4e2a\u5c0f\u9879\u76ee\uff0c\u503e\u5411 vscode+\u63d2\u4ef6\uff0c\u611f\u8c22\u6307\u70b9</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/liuguangxuan", 
        "name": "liuguangxuan", 
        "avatar": "https://cdn.v2ex.com/avatar/e595/7aa6/140318_large.png?m=1770263071"
      }, 
      "url": "https://www.v2ex.com/t/1143633", 
      "title": "\u60f3\u7cfb\u7edf\u7684\u5b66\u4e60 Modern C++\uff0c\u9ebb\u70e6\u5927\u4f6c\u4eec\u63a8\u8350\u4e00\u4e9b\u4e66\u7c4d", 
      "id": "https://www.v2ex.com/t/1143633", 
      "date_published": "2025-07-07T23:59:06+00:00", 
      "content_html": "<p>\u591a\u5e74 C++\u5f00\u53d1\u7ecf\u9a8c\uff0c\u4f46\u662f\u5bf9\u4e00\u4e9b\u65b0\u7279\u6027\u77e5\u4e4b\u751a\u5c11\uff0c\u60f3\u7cfb\u7edf\u7684\u5b66\u4e60\u4e00\u4e0b\uff0c\u9ebb\u70e6\u63a8\u8350\u4e00\u4e9b\u4e66\u7c4d\u3002</p>\n<p>\u6700\u597d\u662f\u7c7b\u4f3c\u300a C++ Primer \u300b\u90a3\u6837\u6743\u5a01\u7684\u4e66\u7c4d\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/aqtata", 
        "name": "aqtata", 
        "avatar": "https://cdn.v2ex.com/avatar/be60/9f31/171110_large.png?m=1764074284"
      }, 
      "url": "https://www.v2ex.com/t/1142912", 
      "date_modified": "2025-07-04T01:28:58+00:00", 
      "content_html": "<p>\u4e00\u4e2a\u52a8\u6001\u5e93\u9879\u76ee\uff0c\u652f\u6301 win32 \u548c arm64 \uff0c\u7f16\u8bd1\u5668\u662f msvc \u548c gcc \uff08 gcc \u662f\u81ea\u5df1\u4ece\u6e90\u7801\u7f16\u8bd1\u7684\uff0c\u7248\u672c 15.1.0 \uff09\n\u5bf9\u5916\u66b4\u9732\u4e00\u4e2a\u6807\u51c6 C API \uff0c\u5176\u5185\u90e8\u5b9e\u73b0\u53ea\u6709\u4e00\u884c\u4ee3\u7801\uff0c\u8c03\u7528\u4e00\u4e2a\u5185\u90e8\u540d\u79f0\u7a7a\u95f4\u5185\u7684\u65b9\u6cd5</p>\n<pre><code class=\"language-c++\">int my_foo()\n{\n    return internal::bar();\n}\n</code></pre>\n<p>\u9b54\u5e7b\u7684\u4e8b\u60c5\u662f\uff0c\u8fd9\u4e2a so \u6587\u4ef6\uff0c\u6211\u5199\u4e00\u4e2a\u63a7\u5236\u53f0\u7a0b\u5e8f\u53bb\u8c03\u7528\u5b83\uff0c\u80fd\u987a\u5229\u8fdb\u5165\u5230<code>bar()</code>\u4e2d\uff0c\u653e\u5230\u5b9e\u9645\u9879\u76ee\u4e2d<code>bar()</code>\u6839\u672c\u5c31\u6ca1\u6709\u88ab\u8c03\u7528\uff0c\u4e8e\u662f\u5c1d\u8bd5\u6253\u5370</p>\n<pre><code class=\"language-c++\">int my_foo()\n{\n    std::cout &lt;&lt; \"111111111111111\" &lt;&lt; std::endl;\n    std::cout &lt;&lt; __FUNCTION__ &lt;&lt; std::endl;\n    std::cout &lt;&lt; \"internal::bar address: \" &lt;&lt; (long long)((void*)&amp;internal::bar);\n    return internal::bar();\n}\n</code></pre>\n<p>\u597d\u5bb6\u4f19\uff0c\u5728 linux \u4e0b\u53ea\u80fd\u6253\u5370\u524d\u4e24\u884c\uff0c\u7136\u540e\u51fd\u6570\u8fd4\u56de 0 \uff0c\u4f46\u8fd9\u79cd\u60c5\u51b5\u53ea\u53d1\u751f\u5728\u9879\u76ee\u5f15\u7528\u65f6\u51fa\u73b0\u3002\u5199\u4e00\u4e2a\u7b80\u5355\u7684\u547d\u4ee4\u884c\u7a0b\u5e8f\u89e6\u53d1\u5b8c\u5168\u6ca1\u95ee\u9898\uff0cwin32 \u4e0b\u4e5f\u90fd\u6ca1\u95ee\u9898\u3002\n\u6211\u60f3 so \u6587\u4ef6\u5df2\u7ecf\u662f\u4e8c\u8fdb\u5236\u4e86\uff0c\u8fd8\u80fd\u88ab\u94fe\u63a5\u5b83\u7684\u7a0b\u5e8f\u4f18\u5316\u4e0d\u6210\uff1f\u8fd9\u91cc\u5361\u4f4f\u4e86\uff0c\u4e0d\u77e5\u9053\u600e\u4e48\u529e\n\u9879\u76ee\u5747\u4f7f\u7528\u4e86<code>-O2</code></p>\n", 
      "date_published": "2025-07-04T01:27:01+00:00", 
      "title": "\u56f0\u6270\u51e0\u5929\u7684\u95ee\u9898\uff0c\u8fd9\u662f\u88ab gcc \u4f18\u5316\u4e86\u5417\uff1f", 
      "id": "https://www.v2ex.com/t/1142912"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/daju233", 
        "name": "daju233", 
        "avatar": "https://cdn.v2ex.com/avatar/ad40/98a9/590132_large.png?m=1725647291"
      }, 
      "url": "https://www.v2ex.com/t/1141838", 
      "date_modified": "2025-06-30T00:08:52+00:00", 
      "content_html": "<p>\u5982\u9898\uff0c\u5982\u4f55\u5199\u51fa\u597d\u7684 c++\u4ee3\u7801</p>\n", 
      "date_published": "2025-06-29T17:46:59+00:00", 
      "title": "\u597d\u7684 c++\u4ee3\u7801\u662f\u4ec0\u4e48\u6837\u7684", 
      "id": "https://www.v2ex.com/t/1141838"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/w568w", 
        "name": "w568w", 
        "avatar": "https://cdn.v2ex.com/gravatar/a07da489e1f63eaa83cded683786df23?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1141180", 
      "date_modified": "2025-06-26T06:35:43+00:00", 
      "content_html": "<p>\u5982\u9898\u3002\u73b0\u5728\u7684\u5e73\u53f0/\u7f16\u7a0b\u8bed\u8a00\u8fd0\u884c\u65f6\uff0c\u6309\u517c\u5bb9\u6027\u5927\u81f4\u53ef\u4ee5\u5206\u6210\u51e0\u7c7b\uff1a</p>\n<ol>\n<li><strong>\u51e0\u4e4e\u4e0d\u53d8\u52a8\uff0c\u7a0b\u5e8f\u53ef\u4ee5\u52a8\u6001\u94fe\u63a5/\u8c03\u7528</strong>\uff1aPOSIX API \uff0cWin32 API \uff1b</li>\n<li><strong>\u7ecf\u5e38\u53d8\u52a8\uff0c\u4f46\u53ef\u4ee5\u81ea\u7531\u5b89\u88c5</strong>\uff1aPython \uff0cJava \uff0cNodeJS \uff0cC# .NET\u2026\u2026\uff1b</li>\n<li><strong>\u7ecf\u5e38\u53d8\u52a8\uff0c\u4f46\u76f4\u63a5\u5d4c\u5165\u5230\u7f16\u8bd1\u540e\u7684\u7a0b\u5e8f</strong>\uff1aGo \uff0cRust\u2026\u2026\u3002</li>\n</ol>\n<p>\u552f\u72ec C \u548c C++\uff0c\u5728 Linux \u4e0b\u4e0d\u4ec5\u7ecf\u5e38\u53d8\u52a8\uff0c\u5e76\u4e14\u4e0d\u5411\u524d\u517c\u5bb9\uff08\u5373\u65e7\u7248 libc(++) \u4e0d\u80fd\u8fd0\u884c\u65b0\u7248 libc(++) \u7684\u7a0b\u5e8f\uff09\u3001\u4e0d\u4e92\u76f8\u517c\u5bb9\uff08 musl-libc \u7684\u7a0b\u5e8f\u4e0d\u80fd\u7528 glibc \u8fd0\u884c\uff09\uff0c\u6211\u5728 Arch \u4e0a\u7f16\u8bd1\u7684\u7a0b\u5e8f\u51e0\u4e4e\u6ca1\u6cd5\u62ff\u5230 Ubuntu LTS \u4e0a\u8fd0\u884c\uff0c\u53ea\u80fd\u5f00\u4e2a Docker \u5bb9\u5668\u6765\u7f16\u8bd1\u3002</p>\n<p>\u8fd9\u5c31\u5bfc\u81f4\u4e24\u4e2a\u5947\u602a\u7684\u73b0\u8c61\uff1a</p>\n<ol>\n<li>\u5728\u9762\u5411\u65e7\u53d1\u884c\u7248\u5f00\u53d1 C/C++ \u7684\u65f6\u5019\uff0c\u5f88\u591a\u4eba<strong>\u5b81\u613f\u81ea\u5df1\u642d\u53e4\u8001\u5f00\u53d1\u73af\u5883\u6765\u7f16\u8bd1\uff0c\u4e5f\u4e0d\u613f/\u4e0d\u80fd\u5347\u7ea7\u76ee\u6807\u73af\u5883</strong>\u3002\u800c\u5728 Python \u3001Java \u4e4b\u7c7b\u7684\u8bed\u8a00\u91cc\uff0c\u7b2c\u4e00\u53cd\u5e94\u662f\u76f4\u63a5\u7ed9\u76ee\u6807\u73af\u5883\u88c5\u4e2a\u65b0\u7248 Python/JRE \u3002</li>\n<li>\u5f88\u591a C/C++ \u8f6f\u4ef6\u4e0d\u5f97\u4e0d\u53d1\u5e03<strong>\u4e00\u5806\u53d8\u4f53\u6765\u4fdd\u8bc1\u517c\u5bb9\u6027</strong>\uff08\u6b64\u5916\uff0cC++ \u8fd8\u6709 CXX11ABI \u7684\u517c\u5bb9\u6027\u95ee\u9898\uff09\uff0c\u6216\u8005\u5e72\u8106\u8ba9\u7528\u6237\u81ea\u5df1\u7f16\u8bd1\uff08\u7136\u800c\u7528\u6237\u5e76\u4e0d\u662f\u4f55\u65f6\u90fd\u6709\u7a7a\u3001\u6709\u80fd\u529b\u642d\u73af\u5883\uff0c\u5c24\u5176\u662f\u4e00\u4e9b\u7f16\u8bd1\u4f9d\u8d56\u975e\u5e38\u590d\u6742\u7684\u8f6f\u4ef6\uff09\u3002</li>\n</ol>\n<p>\u4f46\u4f3c\u4e4e\u5f88\u5c11\u6709\u4eba\u4f1a\u4e13\u95e8\u53bb\u4e0b\u8f7d\u6807\u51c6\u5e93\u5b9e\u73b0\u3002\u9664\u4e86 Conda \uff0c\u597d\u50cf\u4e5f\u6ca1\u4eba\u5173\u5fc3\u600e\u4e48\u6253\u5305\u6807\u51c6\u5e93\u3002</p>\n<p>\u4e3a\u4ec0\u4e48 C/C++ \u4e0d\u50cf JRE \u90a3\u6837\uff0c\u53d1\u5e03\u4e00\u4e2a C/C++ Runtime \u5462\uff0c\u8fd9\u6837\u5206\u53d1\u8f6f\u4ef6\u4e0d\u662f\u65b9\u4fbf\u5f97\u591a\u5417\uff1f</p>\n", 
      "date_published": "2025-06-26T04:39:27+00:00", 
      "title": "\u4e3a\u4ec0\u4e48 C/C++ \u8bed\u8a00\u7684\u6807\u51c6\u5e93\u4e0d\u505a\u6210 Java \u90a3\u6837\u53ef\u5b89\u88c5\u7684\u8fd0\u884c\u65f6\uff1f", 
      "id": "https://www.v2ex.com/t/1141180"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Noicdi", 
        "name": "Noicdi", 
        "avatar": "https://cdn.v2ex.com/avatar/8a48/fcf7/584185_large.png?m=1734936376"
      }, 
      "url": "https://www.v2ex.com/t/1130269", 
      "title": "CLion \u63d0\u4f9b\u975e\u5546\u4e1a\u514d\u8d39\u4f7f\u7528\u4e86", 
      "id": "https://www.v2ex.com/t/1130269", 
      "date_published": "2025-05-07T13:17:21+00:00", 
      "content_html": "<p><a href=\"https://blog.jetbrains.com/clion/2025/05/clion-is-now-free-for-non-commercial-use/\" rel=\"nofollow\">https://blog.jetbrains.com/clion/2025/05/clion-is-now-free-for-non-commercial-use/</a></p>\n<p>\u5f53\u521d\u5e74\u5ea6\u8ba2\u9605\u7ed9\u7684\u6c38\u4e45\u56de\u9000\u8bb8\u53ef\u662f 2023.3 \u7248\u672c\u7684\uff0c\u8fd9\u4e2a\u7248\u672c\u6ca1\u6709\u5e76\u5165 CLion Nova \uff0c\u8dd1\u516c\u53f8\u7684\u9879\u76ee\u786e\u5b9e\u611f\u89c9\u4f1a\u6709\u70b9\u5403\u529b\uff0c\u4e0d\u77e5\u9053\u4f7f\u7528 Nova \u7684\u5f15\u64ce\u4f1a\u4e0d\u4f1a\u597d\u4e00\u70b9\uff0c\u53ef\u60dc\u516c\u53f8\u9879\u76ee\u5df2\u7ecf\u7528\u4e0d\u4e0a\u4e86\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/s609926202", 
        "name": "s609926202", 
        "avatar": "https://cdn.v2ex.com/gravatar/f475e9ec3926841965209f62cc90a1d4?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1126446", 
      "title": "MFC c++\u5bf9\u8bdd\u6846\u9879\u76ee\u4f7f\u7528 httplib \u521b\u5efa\u9759\u6001\u8d44\u6e90\u670d\u52a1\uff0c Debug \u65f6\u6bcf\u6b21\u8bbf\u95ee\u90fd\u4f1a\u88ab\u65ad\u4e0b\u662f\u4ec0\u4e48\u539f\u56e0", 
      "id": "https://www.v2ex.com/t/1126446", 
      "date_published": "2025-04-18T05:39:53+00:00", 
      "content_html": "<p>\u662f\u5728 OnInitDialog \u4e2d\u521b\u5efa\u7684\u7ebf\u7a0b\uff1a</p>\n<pre><code>UINT CMFCDlg::HttpServerThreadProc(LPVOID lpParam)\n{\n    httplib::Server svr;\n\n    svr.set_base_dir(\"./\");\n    auto ret = svr.set_mount_point(\"/\", \"./images\");\n    if (!ret) {\n    \tstd::cout &lt;&lt; \"The specified base directory doesn't exist...\" &lt;&lt; std::endl;\n    }\n\n    svr.listen(\"0.0.0.0\", 5000);\n    return 0;\n}\n\nBOOL CMFCDlg::OnInitDialog()\n{\n\tAfxBeginThread(HttpServerThreadProc, nullptr);\n}\n</code></pre>\n<p>\u7136\u540e\u70b9\u51fb\u672c\u5730 windows \u8c03\u8bd5\u5668\u542f\u52a8\u540e\uff0c\u5728\u6d4f\u89c8\u5668\u4e2d\u8bbf\u95ee 127.0.0.1:5000/img.jpg \u5c31\u4f1a\u5728 vs2019 \u4e2d httplib.h \u4e2d\u88ab\u65ad\u4e0b\uff1a\n<a href=\"https://imgur.com/w00YPbh\" rel=\"nofollow\">https://imgur.com/w00YPbh</a></p>\n<p>\u8bf7\u95ee\u8fd9\u4e2a\u662f\u4ec0\u4e48\u539f\u56e0\uff1f</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/hwdq0012", 
        "name": "hwdq0012", 
        "avatar": "https://cdn.v2ex.com/gravatar/c08b1e13beb2581c7464f4e5817fbb92?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1124436", 
      "date_modified": "2025-04-10T04:58:19+00:00", 
      "content_html": "<pre><code class=\"language-c++\">struct DV_COMMON_EXPORT product_config {\n\n\n    int detect_delay_ms = 0;\n\n\n    int reject_delay_ms = 0;\n\n    int detect_count_oneshot = 1;\n    int detect_count = 0;\n\n    int detect_count_interval = 100;\n    std::string ref_image_path = \"1\";\n\n    int cam_x =2;\n    int cam_y =3;\n\n\n    // yuv420p\",rgb888\n    std::string rpicam_pixel_type = \"yuv420p\";\n\n    int tmp =44;\n};\n\n</code></pre>\n<p>\u8c03\u8bd5\u65f6\u53d1\u73b0\u4ece\u7b2c\u4e00\u4e2a\u5b57\u7b26\u4e32\u5f80\u540e\uff0c\u5b57\u6bb5\u90fd\u6ca1\u6709\u6b63\u5e38\u521d\u59cb\u5316</p>\n<pre><code class=\"language-bash\">(gdb) info line\nLine 1021 of \"/repos/dv_app_solution/prism_all/prism/include/prism/prismJson.hpp\"\n   starts at address 0x7fffeb60f470 &lt;prism::json::fromJsonString&lt;dv_common_config&gt;(std::string const&amp;&amp;)+28&gt;\n   and ends at 0x7fffeb60f478 &lt;prism::json::fromJsonString&lt;dv_common_config&gt;(std::string const&amp;&amp;)+36&gt;.\n(gdb) list\n1016\t\n1017\ttemplate &lt;class T&gt;\n1018\tstatic inline std::unique_ptr&lt;T&gt; fromJsonString(const std::string&amp;&amp; str)\n1019\t{\n1020\t    std::unique_ptr&lt;T&gt; model = std::make_unique&lt;T&gt;();\n1021\t    privates::jsonType&lt;T&gt;::type::from_jsonStr(std::move(*model), std::move(str), 0, static_cast&lt;int&gt;(str.length() - 1));\n1022\t\n1023\t    return model;\n1024\t}\n1025\ttemplate &lt;class T&gt;\n(gdb) print *model\n$9 = {detect_delay_ms = 0, reject_delay_ms = 0, detect_count_oneshot = 1, detect_count = 0, detect_count_interval = 100, ref_image_path = \"\", cam_x = 0, \n  cam_y = 0, rpicam_pixel_type = &lt;error reading variable: Cannot create a lazy string with address 0x0, and a non-zero length.&gt;, tmp = 796092265}\n(gdb) \n</code></pre>\n<p>\u7a0b\u5e8f\u4f1a\u5728\u540e\u9762\u7684\u903b\u8f91\u4e2d\uff0c\u5d29\u6e83\u5728\u4f7f\u7528 rpicam_pixel_type \u8fd9\u4e2a\u5b57\u6bb5\u7684\u65f6\u5019,\u7528 asan \u770b\u4e86\u662f\u7531\u4e8e\u8fd9\u4e2a\u9519\u8bef\u7684\u5b57\u7b26\u4e32\u88ab\u8ba4\u4e3a\u8d85\u8fc7 10 \u4e2a T \u5bfc\u81f4\u5d29\u6e83\n\u968f\u4fbf\u628a\u5b83\u8d4b\u503c\u7ed9\u5176\u4ed6\u53d8\u91cf\u5c31\u4f1a\u5d29\u6e83</p>\n<p>\u6ca1\u6709\u601d\u8def\uff0c\u6709\u4ec0\u4e48\u65b9\u5f0f\u8fdb\u4e00\u8fdb\u5b9a\u4f4d\u5417</p>\n", 
      "date_published": "2025-04-10T04:06:23+00:00", 
      "title": "c++\u8c03\u8bd5\u9047\u5230\u5947\u602a\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1124436"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/ChainLock", 
        "name": "ChainLock", 
        "avatar": "https://cdn.v2ex.com/avatar/c97f/842f/426828_large.png?m=1757037316"
      }, 
      "url": "https://www.v2ex.com/t/1124351", 
      "title": "\u6c42\u63a8\u8350 C++ \u9ad8\u6027\u80fd\u7684 web \u6846\u67b6\uff0c curd \u7528", 
      "id": "https://www.v2ex.com/t/1124351", 
      "date_published": "2025-04-10T00:36:35+00:00", 
      "content_html": ""
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/zwyyy456", 
        "name": "zwyyy456", 
        "avatar": "https://cdn.v2ex.com/avatar/65b7/46e9/366118_large.png?m=1730997579"
      }, 
      "url": "https://www.v2ex.com/t/1122348", 
      "title": "\u4e00\u4e2a\u9879\u76ee\u4e0b\u6709\u591a\u4e2a cpp \u7a0b\u5e8f\u7684\u6e90\u6587\u4ef6\u4ee5\u53ca\u591a\u4e2a\u7a0b\u5e8f\u5171\u7528\u7684\u6e90\u6587\u4ef6\u4e0e\u5934\u6587\u4ef6\uff0c vscode \u7684 clangd \u63d2\u4ef6\u4e0e compile_commands.json \u8be5\u5982\u4f55\u914d\u7f6e", 
      "id": "https://www.v2ex.com/t/1122348", 
      "date_published": "2025-03-31T09:06:15+00:00", 
      "content_html": "<p>\u4f8b\u5982\u5728 source \u76ee\u5f55\u4e0b\u6709 a b c common frame \u4e94\u4e2a\u6587\u4ef6\u5939\uff0cA B C \u4e09\u4e2a\u7a0b\u5e8f\u7684\u4e3b\u8981\u6e90\u6587\u4ef6\u5206\u522b\u4f4d\u4e8e a b c \u4e09\u4e2a\u76ee\u5f55\uff0c\u800c common \u4e0e frame \u4e0b\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5934\u6587\u4ef6\u4e0e\u6e90\u6587\u4ef6\uff0c\u4f8b\u5982\u4e00\u4e9b\u5171\u7528\u7684\u51fd\u6570\u3001\u7c7b\u7684\u58f0\u660e\u4e0e\u5b9a\u4e49\uff1b</p>\n<p>A B C \u4e09\u4e2a\u7a0b\u5e8f\u5206\u522b\u6709\u901a\u8fc7\u7956\u4f20\u5de5\u5177\u751f\u6210\u7684 makefile \uff08\u4e0d\u662f cmake \uff09\uff0c\u6211\u662f\u5229\u7528 bear \u6839\u636e\u8fd9\u4e9b makefile \u751f\u6210\u7684 <code>compile_commands.json</code> \u6587\u4ef6\uff0c\u5206\u522b\u8bb0\u4e3a A.json \u3001B.json \u3001C.json \uff0c\u6211\u73b0\u5728\u662f\u628a A.json \u653e\u5728 a \u76ee\u5f55\u4e0b\uff0cB.json \u653e\u5728 b \u76ee\u5f55\u4e0b\uff0cC.json \u653e\u5728 c \u76ee\u5f55\u4e0b\uff1b</p>\n<p>\u4f46\u662f\u8fd9\u6837\u7684\u8bdd\uff0c\u4ee5 A \u4e3a\u4f8b\uff0c\u5728\u6211\u5370\u8c61\u91cc\uff0cvscode \u7684 clangd \u65e0\u6cd5\u8df3\u8f6c\u5230\u4f4d\u4e8e common \u6216\u8005 frame \u6587\u4ef6\u5939\u4e2d\u7684\u51fd\u6570\u58f0\u660e\u6216\u8005\u5b9a\u4e49\uff0c\u53ea\u6709\u58f0\u660e\u4ee5\u53ca\u5b9a\u4e49\u5728 a \u6587\u4ef6\u5939\u4e2d\u7684\u51fd\u6570\u53ef\u4ee5\u76f4\u63a5\u8df3\u8f6c\u8fc7\u53bb\uff0c\u6211\u662f common \u4e0e frame \u6587\u4ef6\u5939\u4e2d\u4e5f\u653e\u4e86\u4e00\u4efd A.json \uff0c\u8fd9\u6837\u624d\u80fd\u8df3\u8f6c\uff0c\u4f46\u662f\u5370\u8c61\u91cc\u8fd8\u662f\u6709\u4e0d\u5b8c\u5584\u7684\u5730\u65b9\u3002</p>\n<p>\u6c42\u6559\u4e00\u4e0b\u4e07\u80fd\u7684 v \u53cb\uff0c\u6709\u6ca1\u6709\u529e\u6cd5\u914d\u7f6e\u4e00\u4e0b clangd \uff0c\u5b9e\u73b0\u8fd9\u4e9b\u51fd\u6570\u7684\u6b63\u5e38\u8df3\u8f6c\u5417\uff0c\u5c24\u5176\u662f\u8df3\u8f6c\u5230 common \u4e0e frame \u4e2d\u7684\u51fd\u6570\u3002</p>\n<blockquote>\n<p>\u8fd9\u4e2a\u6587\u4ef6\u5939\u5206\u5e03\u662f\u7b80\u5316\u7684\uff0c\u5b9e\u9645\u4e0a\u8fdb\u7a0b\u4e0d\u6b62 A B C \u4e09\u4e2a\uff0c\u5171\u7528\u7684\u6587\u4ef6\u5939\u4e5f\u4e0d\u6b62\u4e24\u4e2a\u3002</p>\n</blockquote>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/RiverBWU", 
        "name": "RiverBWU", 
        "avatar": "https://cdn.v2ex.com/gravatar/e3845df60bc7c1df3921311d41c85f0f?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1118551", 
      "title": "C++\u5e93\u811a\u624b\u67b6\u9879\u76ee\u53ca\u601d\u8003", 
      "id": "https://www.v2ex.com/t/1118551", 
      "date_published": "2025-03-14T14:23:25+00:00", 
      "content_html": "<p>\u4e4b\u524d\u5728\u8003\u8651\u7f16\u5199\u4e00\u4e9b\u4e2a\u4eba\u7684\u5f00\u6e90\u9879\u76ee\uff0c\u4e0d\u5962\u6c42\u6210\u4e3a\u4ec0\u4e48\u660e\u661f\u9879\u76ee\uff0c\u53ea\u5e0c\u671b\u628a\u5df2\u6709\u7684\u6280\u80fd\u548c\u77e5\u8bc6\u8fdb\u884c\u603b\u7ed3\u3002\u4e00\u65b9\u9762\u5c06\u6765\u9047\u5230\u7c7b\u4f3c\u9700\u6c42\u65f6\u53ef\u4ee5\u76f4\u63a5\u62ff\u53bb\u7528\uff0c\u53e6\u4e00\u65b9\u9762\u4e5f\u7ed9\u9047\u5230\u76f8\u540c\u95ee\u9898\u7684\u4eba\u4e00\u4e9b\u5e2e\u52a9\u3002</p>\n<p>\u6700\u5f00\u59cb\u7684\u60f3\u6cd5\u662f\u4e0d\u7ba1\u4e09\u4e03\u4e8c\u5341\u4e00\u5148\u5199\u8d77\u6765\uff0c\u4e4b\u540e\u518d\u9010\u6b65\u6d4b\u8bd5\u3001\u4fee\u6539\u548c\u5b8c\u5584\u3002\u6ca1\u60f3\u5230\u529f\u80fd\u8fd8\u6ca1\u5806\u591a\u5c11\uff0c\u90a3\u4e9b\u89c9\u5f97\u4e0d\u4f1a\u6709\u95ee\u9898\u61d2\u5f97\u6d4b\u7684\u6a21\u5757\uff0c\u603b\u662f\u5199\u51fa\u4f4e\u7ea7 bug \uff1b\u7b49\u60f3\u8981\u6dfb\u52a0\u5355\u5143\u6d4b\u8bd5\u65f6\uff0c\u9762\u5bf9\u7684\u662f\u5199\u6210\u4e00\u56e2\u7684\u6784\u5efa\u811a\u672c\uff1b\u4e4b\u540e\u9002\u914d\u8de8\u5e73\u53f0\uff0c\u6bcf\u6b21\u63d0\u4ea4\u4ee3\u7801\u90fd\u5f97\u5728\u865a\u62df\u673a\u4e4b\u95f4\u6765\u56de\u5207\u6362\u3001\u62c9\u53d6\u4ee3\u7801\u548c\u7f16\u8bd1\u6d4b\u8bd5\u3002</p>\n<p>\u5728\u603b\u7ed3\u5931\u8d25\u6559\u8bad\u5e76\u53c2\u8003\u5f00\u6e90\u9879\u76ee\u540e\uff0c\u6211\u51b3\u5b9a\u7f16\u5199\u4e00\u4e2a\u9002\u5408\u81ea\u5df1\u9700\u6c42\u7684\u811a\u624b\u67b6\u9879\u76ee<a href=\"https://github.com/JanSimplify/KRCppLibraryTemplate\" rel=\"nofollow\">KRCppLibraryTemplate\n</a>\uff1a</p>\n<ul>\n<li>\u8981\u652f\u6301\u8de8\u5e73\u53f0\uff0c\u652f\u6301\u52a8\u6001\u5e93\u548c\u9759\u6001\u5e93\uff0c\u4e0d\u80fd Linux \u4e0b\u8dd1\u5f97\u597d\u597d\u7684\uff0c\u5230 Windows \u4e0b\u56e0\u4e3a\u52a8\u6001\u5e93\u7b26\u53f7\u5bfc\u51fa\u7b49\u95ee\u9898\u8ff7\u60d1\u534a\u5929\uff1b</li>\n<li>\n\u5c3d\u53ef\u80fd\u8ba9\u9519\u8bef\u5728\u5728\u65e9\u671f\u88ab\u53d1\u73b0\uff1a<ul>\n<li>\u96c6\u6210\u5355\u5143\u6d4b\u8bd5\u6846\u67b6\uff1b</li>\n<li>\u4e25\u683c\u7684\u7f16\u8bd1\u5668\u68c0\u67e5\uff1b</li>\n<li>sanitizer \uff1b</li>\n<li>\u4f7f\u7528 github CI \u548c Codecov \u81ea\u52a8\u5b8c\u6210\u5404\u4e2a\u5e73\u53f0\u7684\u6d4b\u8bd5\u548c\u62a5\u544a\uff1b</li>\n</ul>\n</li>\n<li>\u80fd\u591f\u88ab\u5176\u4ed6\u9879\u76ee\u8f7b\u677e\u5f15\u5165\uff0c\u5305\u62ec FetchContent \u548c find_package \uff0c\u540e\u8005\u8981\u6c42\u9879\u76ee\u652f\u6301\u5b89\u88c5\u3002</li>\n</ul>\n<h1>\u5929\u4e0b\u82e6\u6784\u5efa\u4e45\u77e3</h1>\n<p>\u5c31\u6211\u4e2a\u4eba\u7ecf\u5386\u800c\u8a00\uff0c\u5f53\u521d\u5165\u95e8\u5b66\u4e60 C++\u65f6\u786e\u5b9e\u9047\u5230\u4e86\u5f88\u591a\u56f0\u96be\uff0c\u4f46\u597d\u5728\u6709\u5f88\u591a\u4f18\u79c0\u7684\u4e66\u7c4d\u548c\u8d44\u6599\uff08\u6839\u672c\u770b\u4e0d\u5b8c\uff09\uff0c\u5927\u90e8\u5206\u95ee\u9898\u4e5f\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u627e\u5230\u7b54\u6848\u3002</p>\n<p>\u6ca1\u60f3\u5230\u8de8\u8fc7\u8fd9\u5ea7\u5927\u5c71\u540e\uff0c\u8fce\u9762\u800c\u6765\u7684\u662f\u53e6\u4e00\u5ea7\u5927\u5c71\u2014\u2014\u6784\u5efa\uff1a</p>\n<ul>\n<li>\u7f16\u8bd1\u5668\u4e3a\u4ec0\u4e48\u8bf4\u627e\u4e0d\u5230\u5934\u6587\u4ef6\uff1f\u6211\u8981\u600e\u4e48\u544a\u8bc9\u5b83\u6b63\u786e\u7684\u8def\u5f84\uff1f</li>\n<li>\u660e\u660e\u53ea\u5199\u4e86\u4e00\u4e2a\u51fd\u6570\u5b9a\u4e49\uff0c\u4e3a\u4ec0\u4e48\u544a\u8bc9\u6211\u7b26\u53f7\u91cd\u5b9a\u4e49\u4e86\uff1f</li>\n<li>\u94fe\u63a5\u5668\u8bf4\u627e\u4e0d\u5230\u7b26\u53f7\u662f\u4ec0\u4e48\u610f\u601d\uff0c\u800c\u4e14\u8f93\u51fa\u7684\u7b26\u53f7\u8fd8\u50cf\u4e71\u7801\u4e00\u6837\uff1f</li>\n<li>\u7f16\u8bd1\u901a\u8fc7\u4e86\uff0c\u4e00\u8fd0\u884c\u5c31\u627e\u4e0d\u5230\u52a8\u6001\u5e93\u3002</li>\n</ul>\n<p>\u5f53\u4f60\u89c9\u5f97\u5b66\u6709\u6240\u6210\uff0c\u6253\u7b97\u5199\u4e2a\u7a0d\u5fae\u50cf\u6837\u70b9\u7684\u9879\u76ee\u65f6\uff0c\u5c31\u4e00\u5b9a\u4f1a\u88ab\u8fd9\u4e9b\u95ee\u9898\u6df1\u6df1\u56f0\u6270\u3002</p>\n<p>\u8fd9\u4e9b\u95ee\u9898\u90fd\u6765\u81ea\u4e8e C++\u7f16\u8bd1\u6a21\u578b\uff0c\u4ee5\u53ca\u5e73\u53f0\u548c\u7f16\u8bd1\u5668\u5b9e\u73b0\u7ec6\u8282\uff0c\u6ca1\u529e\u6cd5\u4e09\u8a00\u4e24\u8bed\u6982\u62ec\uff0c\u5f53\u521d\u5b66\u4e60\u65f6\u4e3b\u8981\u53c2\u8003\u4e86\u5982\u4e0b\u8d44\u6599\uff1a</p>\n<ul>\n<li><a href=\"https://book.douban.com/subject/26912767/\" rel=\"nofollow\">\u6df1\u5165\u7406\u89e3\u8ba1\u7b97\u673a\u7cfb\u7edf (\u539f\u4e66\u7b2c 3 \u7248)</a>\uff1a\u7b2c\u4e03\u7ae0\u94fe\u63a5\u5bf9\u7f16\u8bd1\u548c\u94fe\u63a5\u8fc7\u7a0b\u8fdb\u884c\u4e86\u7b80\u5355\u660e\u4e86\u7684\u4ecb\u7ecd\u3002\u9002\u5408\u4e86\u89e3\u6982\u5ff5\uff0c\u4f46\u4e0d\u8db3\u4ee5\u8fd0\u7528\u4e8e\u5de5\u7a0b\u5b9e\u8df5\u4e2d\uff1b</li>\n<li><a href=\"https://book.douban.com/subject/3652388/\" rel=\"nofollow\">\u7a0b\u5e8f\u5458\u7684\u81ea\u6211\u4fee\u517b</a>\uff1a\u5305\u542b\u5927\u91cf\u5177\u4f53\u5e73\u53f0\u7ec6\u8282\uff0c\u4ee5\u53ca\u5bf9\u5e94\u7684\u5de5\u5177\u4f7f\u7528\u3002\u53ef\u4ee5\u8bf4\u5e38\u89c1\u95ee\u9898\u7684\u6392\u67e5\u65b9\u6cd5\uff0c\u6211\u90fd\u662f\u4ece\u8fd9\u4e0a\u9762\u5b66\u7684\uff0c\u4e0d\u8fc7\u5b66\u4e60\u66f2\u7ebf\u9661\u5ced\uff0c\u65b0\u624b\u5bb9\u6613\u8ff7\u5931\u81ea\u6211\uff1b</li>\n<li>\u9648\u7855\u7684\u300a C++\u5de5\u7a0b\u5b9e\u8df5\u7ecf\u9a8c\u8c08\u300b\uff1aC++\u7f16\u8bd1\u94fe\u63a5\u6a21\u578b\u7cbe\u8981\u7ae0\u8282\u4e5f\u5bf9\u7f16\u8bd1\u4e2d\u5404\u9636\u6bb5\u8fdb\u884c\u4e86\u4ecb\u7ecd\uff0c\u8bb2\u89e3\u4e86\u5176\u4e2d\u201c\u4e0d\u592a\u4eba\u6027\u5316\u201d\u7684\u8bbe\u8ba1\u7684\u5386\u53f2\u80cc\u666f\u3002</li>\n</ul>\n<p>\u5982\u679c\u60f3\u8981\u65b0\u4eba\u6d88\u5316\u8fd9\u4e9b\u5185\u5bb9\uff0c\u6050\u6015\u4e0d\u592a\u9002\u5408\u5f53\u4eca\u5feb\u8282\u594f\u7684\u804c\u573a\u73af\u5883\uff0c\u6240\u4ee5\u7a0d\u5fae\u5212\u5212\u91cd\u70b9\uff0c\u5176\u4ed6\u7684\u5c31\u8ba9 AI \u6765\u8f85\u52a9\u5427\uff1a</p>\n<ul>\n<li>\u641e\u61c2<code>#include &lt;...&gt;</code>\u548c<code>#include \"...\"</code>\u5bfc\u5165\u5934\u6587\u4ef6\u65f6\u641c\u7d22\u8def\u5f84\u7684\u5dee\u5f02\uff0c\u4ee5\u53ca\u5982\u4f55\u6307\u5b9a\u81ea\u5df1\u6240\u9700\u7684\u641c\u7d22\u8def\u5f84\uff1b</li>\n<li>\u4f7f\u7528\u6269\u5c55\u540d\u6216 readelf \u5206\u8fa8\u52a8\u6001\u5e93\u548c\u9759\u6001\u5e93\uff0c\u4ee5\u53ca\u5982\u4f55\u8ba9\u7f16\u8bd1\u5668\u53bb\u94fe\u63a5\u5b83\u4eec\uff1b</li>\n<li>\u4e86\u89e3 C++\u7684 name mangling \uff0c\u4ee5\u53ca\u94fe\u63a5 C \u5e93\u65f6\u7684<code>extern \"C\"</code>\uff1b</li>\n<li>\u5b66\u4f1a\u4f7f\u7528 nm \u547d\u4ee4\u67e5\u770b\u7b26\u53f7\u8868\uff08 windows \u4e0b\u4f7f\u7528 dumpbin \uff09\uff0c\u5e76\u8bbe\u7f6e name demagling \u9009\u9879\u5c06\u540d\u79f0\u8f6c\u6362\u4e3a\u4eba\u7c7b\u53ef\u8bfb\u683c\u5f0f\uff1b</li>\n<li>\u7528 ldd \u548c readelf \uff08 windows \u7528<a href=\"https://github.com/lucasg/Dependencies\" rel=\"nofollow\">Dependencies</a>\uff09\u67e5\u770b\u5bf9\u52a8\u6001\u5e93\u7684\u4f9d\u8d56\u60c5\u51b5\uff0cSONAME \u7684\u6982\u5ff5\uff1b</li>\n<li>\u4e86\u89e3\u7a0b\u5e8f\u542f\u52a8\u65f6\u5bf9\u52a8\u6001\u5e93\u7684\u641c\u7d22\u903b\u8f91\uff0c\u9664\u4e86\u7cfb\u7edf\u7684\u9ed8\u8ba4\u8def\u5f84\uff0clinux \u4e0b\u9700\u8981\u641e\u61c2 rpath \u3001LD_LIBRARY_PATH \u548c LD_PRELOAD \uff0cwindows \u4e0b\u5219\u662f\u548c Path \u76f8\u5173\uff1b</li>\n</ul>\n<h1>\u6784\u5efa\u7cfb\u7edf</h1>\n<p>\u4f7f\u7528\u6784\u5efa\u7cfb\u7edf\u7684\u76ee\u7684\uff0c\u4e3b\u8981\u662f\u907f\u514d\u91cd\u590d\u7684\u624b\u52a8\u7f16\u5199\u7f16\u8bd1\u811a\u672c\uff0c\u540c\u65f6\u81ea\u52a8\u5206\u6790\u4f9d\u8d56\u53d8\u66f4\uff0c\u4ece\u800c\u63a7\u5236\u91cd\u65b0\u7f16\u8bd1\u7684\u8303\u56f4\uff0c\u52a0\u901f\u6784\u5efa\u8fc7\u7a0b\u3002\u5b9e\u9645\u4e0a\u6784\u5efa\u7cfb\u7edf\u8fd8\u7528\u4e8e\u5904\u7406\u5b89\u88c5\u548c\u6253\u5305\u7b49\u5de5\u4f5c\uff0c\u6709\u7684\u652f\u6301\u4e0d\u540c\u5e73\u53f0\uff0c\u4ece\u800c\u7b80\u5316\u8de8\u5e73\u53f0\u5f00\u53d1\u7684\u5de5\u4f5c\u3002</p>\n<p>\u4e0d\u8fc7\u6784\u5efa\u7cfb\u7edf\u81ea\u8eab\u4e5f\u4f1a\u5e26\u6765\u4e00\u4e9b\u590d\u6742\u6027\uff0c\u6bd4\u5982 make \uff0c\u5b83\u57fa\u4e8e\u624b\u5199\u4f9d\u8d56\u89c4\u5219\uff0c\u5e76\u6839\u636e\u6587\u4ef6\u65f6\u95f4\u6233\u5224\u65ad\u662f\u5426\u53d1\u751f\u53d8\u52a8\uff0c\u5982\u679c\u6f0f\u5199\u4e86\u4f9d\u8d56\uff08\u5934\u6587\u4ef6\u5c24\u5176\u5e38\u89c1\uff09\uff0c\u6216\u662f\u4fee\u6539\u7684\u662f\u7f16\u8bd1\u5668\u5b8f\u5b9a\u4e49\u7b49\u4e0d\u4fee\u6539\u6587\u4ef6\u7684\u9009\u9879\uff0c\u5f88\u53ef\u80fd\u4f1a\u5f97\u5230\u9519\u8bef\u7684\u7ed3\u679c\u3002</p>\n<p>\u6211\u66fe\u7ecf\u5c1d\u8bd5\u7cfb\u7edf\u7684\u5b66\u4e60 make \uff0c\u4f46\u6700\u7ec8\u7ed3\u8bba\u662f\uff0c\u9047\u5230\u8001\u9879\u76ee\uff0c\u8981\u4e48\u91cd\u5199\uff0c\u8981\u4e48\u522b\u52a8\u5b83\uff0c\u9047\u4e8b\u4e0d\u51b3\u5168\u91cf\u91cd\u65b0\u7f16\u8bd1\u3002</p>\n<p>\u7c7b\u4f3c\u7684\uff0cCMake \u4e5f\u6709\u95ee\u9898\uff1a</p>\n<ul>\n<li>\u4f9d\u65e7\u7ee7\u627f\u4e86\u65e9\u671f\u811a\u672c\u8bed\u8a00\u7684\u4e00\u4e9b\u7279\u6027\uff0c\u7f3a\u4e4f OOP \u652f\u6301\uff0c\u53ef\u8bfb\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u5dee\uff1b</li>\n<li>\u5b9e\u73b0\u5e38\u89c1\u9700\u6c42\u8981\u5199\u4e00\u5806\u4ee3\u7801\uff1b</li>\n<li>\u5b98\u65b9\u6587\u6863\u597d\u50cf\u4ec0\u4e48\u90fd\u8bf4\u4e86\uff0c\u53c8\u597d\u50cf\u4ec0\u4e48\u90fd\u6ca1\u8bf4\uff0c\u5b9b\u82e5\u5929\u4e66\u3002</li>\n</ul>\n<p>\u4f46\u8bdd\u53c8\u8bf4\u56de\u6765\uff0c\u6d89\u53ca\u8de8\u5e73\u53f0 C++\u5f00\u53d1\uff0cCMake \u81ea\u8eab\u786e\u5b9e\u6709\u95ee\u9898\uff0c\u4f46\u9009\u62e9 CMake \u6ca1\u5565\u95ee\u9898\u3002</p>\n<h1>CMake</h1>\n<p>\u6bd4\u8f83\u7cfb\u7edf\u548c\u5b8c\u5584\u7684\u53c2\u8003\u8d44\u6599\u5982\u4e0b\uff1a</p>\n<ul>\n<li><a href=\"https://book.douban.com/subject/36787652/\" rel=\"nofollow\">CMake \u6784\u5efa\u5b9e\u6218\uff1a\u9879\u76ee\u5f00\u53d1\u5377</a>\uff1a\u7b2c\u4e00\u7ae0\u5199\u5f97\u5f88\u597d\uff0c\u628a\u4e00\u4e9b\u6838\u5fc3\u6982\u5ff5\u89e3\u91ca\u5f97\u5f88\u6e05\u695a\uff0c\u4e0d\u8fc7\u540e\u9762\u7684\u5185\u5bb9\u5c31\u5199\u5f97\u50cf\u5b98\u65b9\u6587\u6863\u6458\u8981\u4e00\u6837\u4e86\u3002\u542c\u8bf4\u4f5c\u8005\u539f\u672c\u60f3\u628a\u5b9e\u6218\u90e8\u5206\u653e\u5728\u4e0b\u4e00\u5377\u4e2d\uff0c\u7ed3\u679c\u4ece\u5916\u4f01\u8df3\u69fd\u56de\u56fd\u540e\uff0c\u5fd9\u7740\u52a0\u73ed\u6ca1\u65f6\u95f4\u5b8c\u6210\u4e86\uff08\u60e8\uff1b</li>\n<li><a href=\"https://crascit.com/professional-cmake/\" rel=\"nofollow\">Professional CMake: A Practical Guide</a>\uff1a\u4f5c\u8005\u662f CMake \u7ef4\u62a4\u8005\u4e4b\u4e00\uff0c\u57fa\u672c\u4e0a\u5404\u79cd\u9700\u6c42\u548c\u95ee\u9898\u90fd\u53ef\u4ee5\u5728\u5176\u4e2d\u627e\u5230\u7b54\u6848\uff0c\u5e94\u8be5\u662f\u6700\u597d\u7684\u8d44\u6599\uff0c\u4f46\u9605\u8bfb\u96be\u5ea6\u5927\uff0c\u6b63\u5e38\u4eba\u53ef\u80fd\u5543\u4e0d\u52a8\uff1b</li>\n<li><a href=\"https://book.douban.com/subject/37000914/\" rel=\"nofollow\">Modern CMake for C++</a>\uff1a\u96be\u5ea6\u9002\u4e2d\uff0c\u9002\u5408\u65b0\u624b\u9605\u8bfb\uff0c\u4e0d\u8fc7\u6df1\u5ea6\u6bd4\u4e0a\u4e00\u672c\u6d45\u4e00\u4e9b\u3002</li>\n</ul>\n<p>\u73b0\u5728\u7684\u5171\u8bc6\u5e94\u8be5\u662f Modern CMake \uff0c\u4f46\u6211\u731c\u672c\u5c31\u4e0d\u591a\u7684 C++\u7a0b\u5e8f\u5458\u91cc\uff0c\u61c2\u5f97\u5199 CMake \u7684\u4eba\u5c31\u66f4\u5c11\u4e86\uff0c\u66f4\u522b\u63d0\u63a8\u52a8\u6784\u5efa\u7cfb\u7edf\u811a\u672c\u7684\u89c4\u8303\u5316\u3002\u4e0a\u9762\u7684\u77e5\u8bc6\u4ece\u5438\u6536\u5230\u80fd\u591f\u7f16\u5199\u89c4\u8303\u7684\u4ee3\u7801\u9700\u8981\u5f88\u4e45\u7684\u79ef\u7d2f\uff0c\u6240\u4ee5\u8fd9\u4e9b\u5c31\u4ea4\u7ed9\u811a\u624b\u67b6\u6765\u5b8c\u6210\u5427\u3002</p>\n<h1>\u73b0\u5b58\u4f18\u79c0\u7684\u9879\u76ee</h1>\n<p>\u7ecf\u5e38\u5173\u6ce8 CMake \u7684\u4eba\u5e94\u8be5\u90fd\u4e86\u89e3\u8fc7\u8fd9\u51e0\u4e2a\u9879\u76ee\uff1a</p>\n<ul>\n<li><a href=\"https://github.com/TheLartians/ModernCppStarter\" rel=\"nofollow\">ModernCppStarter</a>\uff1a\u76ee\u524d\u6211\u770b\u5230\u8fc7\u7684 C++\u811a\u624b\u67b6\u4e2d\u6700\u4f18\u79c0\u7684\uff0c\u529f\u80fd\u5b8c\u5584\uff0c\u4ee3\u7801\u7ed3\u6784\u6e05\u6670\uff0c\u4e0d\u7ba1\u65b0\u624b\u8fd8\u662f\u8001\u624b\u90fd\u63a8\u8350\u9605\u8bfb\u548c\u5b66\u4e60\u3002\u4e0d\u8fc7\u6ce8\u610f\u5b83\u6ca1\u6709\u5904\u7406 windows \u4e0b\u52a8\u6001\u5e93\u5bfc\u51fa\u7684\u95ee\u9898\uff0c\u9700\u8981\u4f7f\u7528\u52a8\u6001\u5e93\u7684\u8bdd\u5fc5\u987b\u81ea\u884c\u4fee\u6539\u548c\u6d4b\u8bd5\uff1b</li>\n<li><a href=\"https://github.com/cpm-cmake/CPM.cmake\" rel=\"nofollow\">CPM.cmake</a>\uff1a\u5305\u7ba1\u7406\u63d2\u4ef6\uff0c\u672c\u8d28\u4e0a\u662f\u5bf9 FetchContent \u7684\u5c01\u88c5\uff0c\u4f46\u786e\u5b9e\u7b80\u5316\u4e86 API \uff0c\u5c24\u5176\u662f\u5bf9\u4e0b\u8f7d\u4f9d\u8d56\u7684\u7f13\u5b58\u652f\u6301\u3002\u4e0d\u8fc7\u5b83\u5185\u90e8\u4f7f\u7528 block \u521b\u5efa\u4e86\u65b0\u4f5c\u7528\u57df\uff0c\u4f1a\u5bfc\u81f4\u67d0\u4e9b\u5305\u5bf9\u5916\u8bbe\u7f6e CMAKE_MODULE_PATH \u7684\u64cd\u4f5c\u88ab\u5c4f\u853d\uff08\u6bd4\u5982 Catch2 \uff09\uff0c\u9020\u6210 include()\u627e\u4e0d\u5230\u5bf9\u5e94\u6587\u4ef6\u7684\u9519\u8bef\uff1b</li>\n<li><a href=\"https://github.com/TheLartians/PackageProject.cmake\" rel=\"nofollow\">PackageProject.cmake</a>\uff1a\u5c01\u88c5\u5b89\u88c5\u6b65\u9aa4\u7684 API \uff0c\u6ee1\u8db3\u5e38\u89c1\u9700\u6c42\uff0c\u4f46\u4e0d\u652f\u6301\u5b89\u88c5 target_source \u4e2d\u6dfb\u52a0\u7684 FILE_SET \uff0c\u8fd9\u4e2a\u529f\u80fd\u5728 PR \u4e2d\u5df2\u7ecf\u6401\u7f6e\u4e86 3 \u5e74\u3002</li>\n</ul>\n<p>\u6700\u7ec8\u6211\u7684\u9009\u62e9\u662f\u9020\u8f6e\u5b50\uff08 C++\u7a0b\u5e8f\u5458\u5fc5\u7ecf\u4e4b\u8def\uff09\uff0c\u4ece\u9700\u6c42\u89d2\u5ea6\u6765\u8bf4\uff0c\u662f\u56e0\u4e3a\u6211\u5e0c\u671b\u811a\u624b\u67b6\u5e94\u8be5\u5c3d\u53ef\u80fd\u5c01\u88c5\u5e73\u53f0\u5dee\u5f02\uff0c\u80fd\u591f\u652f\u6301\u52a8\u6001\u5e93\u548c\u9759\u6001\u5e93\uff0c\u800c\u4e0d\u662f\u5728\u4e00\u5f00\u59cb\u5c31\u5bf9\u7528\u6237\u5f3a\u52a0\u9650\u5236\u3002\u53e6\u4e00\u65b9\u9762\u5219\u662f\u4e3a\u4e86\u5bf9 CMake \u7684\u5de5\u7a0b\u5b9e\u8df5\u6709\u4e00\u4e2a\u5b8c\u6574\u7684\u4e86\u89e3\u3002</p>\n<h1>\u52a8\u6001\u5e93\u4e0e\u9759\u6001\u5e93</h1>\n<p>\u4ece\u7528\u6237\u89d2\u5ea6\u6765\u8bf4\uff0c\u6839\u636e\u9700\u8981\u9009\u62e9\u52a8\u6001\u5e93\u6216\u9759\u6001\u5e93\u662f\u5f88\u6b63\u5e38\u7684\u9700\u6c42\u3002\u5c31\u7b97\u4e0d\u8003\u8651\u4f7f\u7528\u52a8\u6001\u5e93\u5b9e\u73b0\u5e73\u6ed1\u5347\u7ea7\u3001\u529f\u80fd\u63d2\u4ef6\u7b49\u9700\u6c42\uff0c\u5bf9\u4e8e\u88ab\u591a\u4e2a\u5e93\u6216\u53ef\u6267\u884c\u7a0b\u5e8f\u4f9d\u8d56\u7684\u60c5\u51b5\uff0c\u4f7f\u7528\u52a8\u6001\u5e93\u4e5f\u53ef\u4ee5\u51cf\u5c11\u94fe\u63a5\u65f6\u95f4\u548c\u7a7a\u95f4\u5360\u7528\uff08\u5c24\u5176\u662f FFmpeg \uff09\u3002\u771f\u6b63\u5e94\u8be5\u907f\u514d\u7684\u662f\u5728\u5b58\u5728\u83f1\u5f62\u4f9d\u8d56\u7684\u60c5\u51b5\u4e0b\u8fdb\u884c\u52a8\u6001\u5e93\u548c\u9759\u6001\u5e93\u7684\u6df7\u7f16\uff0cwindows \u4e2d\u7ecf\u5178\u7684\u8de8 DLL \u5185\u5b58\u95ee\u9898\u4fbf\u6765\u6e90\u4e8e\u6b64\uff0c\u8be6\u60c5\u53ef\u89c1<a href=\"https://crascit.com/professional-cmake/\" rel=\"nofollow\">Professional CMake: A Practical Guide</a>\u7684 Mixing Static And Shared Libraries \u7ae0\u8282\u3002</p>\n<p>\u5f88\u591a\u4e2a\u4eba\u5f00\u53d1\u8005\u4e0d\u592a\u4e50\u4e8e\u4e13\u95e8\u9002\u914d\u52a8\u6001\u5e93\uff08\u6bd4\u5982<a href=\"https://github.com/catchorg/Catch2/issues/2895\" rel=\"nofollow\">Catch2: issue 2895</a>\uff09\uff0c\u4e3b\u8981\u539f\u56e0\u5e94\u8be5\u662f\u4f1a\u589e\u52a0\u989d\u5916\u7684\u5de5\u4f5c\u91cf\u3002</p>\n<p>\u540c\u65f6\u652f\u6301\u4e24\u79cd\u5e93\u7684\u8bdd\u53c8\u4ea7\u751f\u4e86\u65b0\u7684\u95ee\u9898\uff0c\u6587\u7ae0<a href=\"https://alexreinking.com/blog/building-a-dual-shared-and-static-library-with-cmake.html\" rel=\"nofollow\">Building a Dual Shared and Static Library with CMake</a>\u4e2d\u8fdb\u884c\u4e86\u4e00\u4e9b\u8ba8\u8bba\uff1a</p>\n<ul>\n<li>\u7528\u6237\u5e94\u8be5\u5982\u4f55\u6307\u5b9a\u94fe\u63a5\u54ea\u4e00\u4e2a\u5e93\uff1b</li>\n<li>\u662f\u9009\u62e9\u4e24\u4e2a\u5e93\u5355\u72ec\u7f16\u8bd1\uff0c\u8fd8\u662f\u5c06\u9759\u6001\u5e93\u4ee5-fPIC \u7f16\u8bd1\u540e\uff0c\u518d\u751f\u6210\u52a8\u6001\u5e93\uff1b</li>\n<li>\u5982\u4f55\u5904\u7406 windows \u5e73\u53f0\u7684\u7b26\u53f7\u5bfc\u51fa\uff1b</li>\n<li>\u5982\u4f55\u5904\u7406\u5b89\u88c5\uff0c\u4ee5\u53ca\u53ea\u5b89\u88c5\u5176\u4e2d\u4e00\u4e2a\u5e93\u7684\u9700\u6c42\u3002</li>\n</ul>\n<p>\u539f\u6587\u7ae0\u4e2d\u7684\u89e3\u51b3\u65b9\u6848\u4e0d\u652f\u6301\u5c06\u52a8\u6001\u5e93\u4e0e\u9759\u6001\u5e93\u5b89\u88c5\u81f3\u540c\u4e00\u4e2a\u76ee\u5f55\u4e0b\uff0c\u8fd9\u91cc\u4e3b\u8981\u4ecb\u7ecd\u6211\u7684\u89e3\u51b3\u65b9\u6848\u3002</p>\n<h2>\u6307\u5b9a\u5e93\u7c7b\u578b</h2>\n<p>\u7528\u6237\u53ef\u4ee5\u901a\u8fc7 static \u548c shared \u4e24\u4e2a\u522b\u540d\u76ee\u6807\u663e\u5f0f\u94fe\u63a5\u81f3\u5bf9\u5e94\u7248\u672c\u7684\u5e93\uff1a</p>\n<pre><code class=\"language-cmake\">target_link_libraries(&lt;app1&gt; PRIVATE KRLibrary::static)\ntarget_link_libraries(&lt;app2&gt; PRIVATE KRLibrary::shared)\n</code></pre>\n<p>\u4e5f\u53ef\u4ee5\u4e0d\u663e\u5f0f\u94fe\u63a5\uff0c\u800c\u662f\u901a\u8fc7\u9009\u9879\u8fdb\u884c\u6307\u5b9a\uff0c\u5f53\u5e93\u4f9d\u8d56\u5c42\u6b21\u8f83\u6df1\u65f6\uff0c\u4fbf\u4e8e\u4ece\u5916\u90e8\u8fdb\u884c\u63a7\u5236\uff1a</p>\n<pre><code class=\"language-cmake\"># \u4e0d\u6307\u5b9a\u52a8\u6001\u5e93\u548c\u9759\u6001\u5e93\uff0c\u901a\u8fc7 BUILD_SHARED_LIBS \u6216 KRLibrary_USE_SHARED_LIBS \u63a7\u5236\n# \u540e\u8005\u4f18\u5148\u7ea7\u66f4\u9ad8\nset(KRLibrary_USE_SHARED_LIBS ON) # \u6bd4\u8d77\u786c\u7f16\u7801\uff0c\u4e00\u822c\u662f\u901a\u8fc7\u547d\u4ee4\u884c\u6216 CMakeCache.txt \u8fdb\u884c\u4fee\u6539\nfind_package(KRLibrary REQUIRED)\ntarget_link_libraries(&lt;app&gt; PRIVATE KRLibrary::KRLibrary)\n</code></pre>\n<h2>\u5e93\u7684\u7f16\u8bd1</h2>\n<p>\u52a8\u6001\u5e93\u548c\u9759\u6001\u5e93\u603b\u662f\u72ec\u7acb\u7f16\u8bd1\uff0c\u4e0d\u4f7f\u7528<code>-fPIC</code>\u7f16\u8bd1\u9759\u6001\u5e93\uff0c\u56e0\u4e3a\u4f1a\u5bf9\u9759\u6001\u5e93\u7528\u6237\u9020\u6210\u4e0d\u5fc5\u8981\u7684\u6027\u80fd\u635f\u8017\u3002</p>\n<p>\u5f53\u5e93\u4f5c\u4e3a\u9876\u5c42\u9879\u76ee\u8fdb\u884c\u6784\u5efa\u65f6\uff0c\u8ba4\u4e3a\u7528\u6237\u662f\u5e93\u672c\u8eab\u7684\u5f00\u53d1\u8005\u6216\u6253\u5305\u4eba\u5458\uff0c\u6b64\u65f6\u9ed8\u8ba4\u5bf9\u4e24\u79cd\u7c7b\u578b\u7684\u5e93\u90fd\u8fdb\u884c\u7f16\u8bd1\u3002</p>\n<p>\u5f53\u5e93\u4f5c\u4e3a\u5b50\u9879\u76ee\u88ab\u5f15\u5165\u65f6\uff0c\u8ba4\u4e3a\u7528\u6237\u53ef\u80fd\u53ea\u9700\u8981\u5176\u4e2d\u4e00\u79cd\u7c7b\u578b\u7684\u5e93\uff0c\u6b64\u65f6\u4e3a\u4e24\u79cd\u7c7b\u578b\u7684\u5e93\u76ee\u6807\u8bbe\u7f6e<a href=\"https://cmake.org/cmake/help/latest/prop_tgt/EXCLUDE_FROM_ALL.html\" rel=\"nofollow\">EXCLUDE_FROM_ALL</a>\u5c5e\u6027\uff0c\u53ea\u6709\u88ab\u4f7f\u7528\u65f6\u624d\u4f1a\u8fdb\u884c\u7f16\u8bd1\uff0c\u907f\u514d\u7528\u6237\u4ea7\u751f\u4e0d\u5fc5\u8981\u7684\u6784\u5efa\u5f00\u9500\u3002</p>\n<p>windows \u4e0b\u8fd8\u9700\u8981\u5904\u7406\u52a8\u6001\u5e93\u548c\u9759\u6001\u5e93\u7684<code>.lib</code>\u540c\u540d\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f7f\u7528\u7684\u662f MSBuild \uff0c\u540c\u540d\u5e93\u6587\u4ef6\u5f88\u53ef\u80fd\u5c31\u88ab\u9759\u9ed8\u8986\u76d6\u6389\u4e86\uff0c\u4f7f\u7528 Ninja \u624d\u4f1a\u63d0\u793a\u9519\u8bef\u3002\u6211\u7684\u89e3\u51b3\u65b9\u6848\u662f\u4e3a windows \u4e0b\u7684\u9759\u6001\u5e93\u57fa\u672c\u540d\u79f0\u6dfb\u52a0<code>_static</code>\u540e\u7f00\uff0c\u5982\u679c\u6709\u4e0d\u540c\u7684\u9700\u6c42\u53ef\u4ee5\u6309\u9700\u81ea\u884c\u8c03\u6574\u3002</p>\n<h2>\u7b26\u53f7\u5bfc\u51fa</h2>\n<p>MSVC \u9ed8\u8ba4\u4e0d\u5bfc\u51fa\u52a8\u6001\u5e93\u7b26\u53f7\uff0c\u9700\u8981\u624b\u52a8\u901a\u8fc7<a href=\"https://learn.microsoft.com/en-us/cpp/cpp/dllexport-dllimport\" rel=\"nofollow\">dllexport \u548c dllimport</a>\u8fdb\u884c\u63a7\u5236\u3002GCC \u548c Clang \u9ed8\u8ba4\u5bfc\u51fa\u5168\u5c40\u7b26\u53f7\uff0c\u4f46\u4e5f\u63d0\u4f9b\u4e86\u5bf9\u5e94\u7684<a href=\"https://gcc.gnu.org/wiki/Visibility\" rel=\"nofollow\">\u63a7\u5236\u9009\u9879</a>\u3002\u5bf9\u4e8e\u4e0a\u8ff0\u5c5e\u6027\uff0cCMake \u63d0\u4f9b\u4e86<a href=\"https://cmake.org/cmake/help/latest/prop_tgt/LANG_VISIBILITY_PRESET.html\" rel=\"nofollow\">&lt;LANG&gt;_VISIBILITY_PRESET</a>\u548c<a href=\"https://cmake.org/cmake/help/latest/prop_tgt/VISIBILITY_INLINES_HIDDEN.html\" rel=\"nofollow\">VISIBILITY_INLINES_HIDDEN</a>\u8fdb\u884c\u63a7\u5236\u3002</p>\n<p>\u4ece\u201c\u8ba9\u9519\u8bef\u5c3d\u65e9\u88ab\u53d1\u73b0\u201d\u7684\u89d2\u5ea6\u51fa\u53d1\uff0c\u6211\u9009\u62e9\u9ed8\u8ba4\u4e0d\u5bfc\u51fa\u7b26\u53f7\uff1a</p>\n<pre><code class=\"language-cmake\">CXX_VISIBILITY_PRESET \"hidden\"\nVISIBILITY_INLINES_HIDDEN ON\n</code></pre>\n<p>\u800c\u5bfc\u51fa\u5b8f\u5219\u4ea4\u7ed9<a href=\"https://cmake.org/cmake/help/latest/module/GenerateExportHeader.html\" rel=\"nofollow\">GenerateExportHeader</a>\u81ea\u52a8\u751f\u6210\uff0c\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u53ea\u9700\u8981\u5f15\u5165\u751f\u6210\u7684\u5934\u6587\u4ef6\uff0c\u5e76\u4e3a\u8981\u5bfc\u51fa\u7684\u51fd\u6570\u6dfb\u52a0\u5b8f\u6807\u8bb0\u5373\u53ef\uff1a</p>\n<pre><code class=\"language-cpp\">#pragma once\n#include &lt;krlibrary/export.hpp&gt;\nnamespace krlibrary\n{\nKRLIBRARY_EXPORT void exported_hello();\n} // namespace krlibrary\n</code></pre>\n<p>\u52a8\u6001\u5e93\u548c\u9759\u6001\u5e93\u5171\u7528\u4e00\u4efd\u5934\u6587\u4ef6\uff0c\u56e0\u6b64\u4f7f\u7528\u9759\u6001\u5e93\u65f6\uff0c\u81ea\u52a8\u8bbe\u7f6e\u5b8f\u9009\u9879\u7981\u7528\u7b26\u53f7\u5bfc\u51fa\u5c5e\u6027\uff0c\u4e0d\u9700\u8981\u7528\u6237\u624b\u52a8\u5904\u7406\uff1a</p>\n<pre><code class=\"language-cmake\">target_compile_definitions(\n    \"${static_target}\"\n    PUBLIC \"${project_name_uppercase}_STATIC_DEFINE\"\n)\n</code></pre>\n<h2>\u5b89\u88c5</h2>\n<p>\u5b89\u88c5\u4e00\u822c\u6d89\u53ca\u4e09\u7c7b\u6587\u4ef6\uff1a</p>\n<ul>\n<li>\u52a8\u6001\u5e93\u548c\u9759\u6001\u5e93\u6587\u4ef6\uff1b</li>\n<li>\u5934\u6587\u4ef6\uff0c\u8fd9\u91cc\u4e24\u8005\u7684\u5934\u6587\u4ef6\u662f\u76f8\u540c\u7684\uff1b</li>\n<li>\u7528\u4e8e\u652f\u6301 find_package \u5bfc\u5165\u7684\u6587\u4ef6\uff0c\u4f8b\u5982<code>*Config.cmake</code>\u548c<code>*Targets.cmake</code>\u6587\u4ef6\u3002</li>\n</ul>\n<p>\u4ece\u6253\u5305\u4eba\u5458\u7684\u89d2\u5ea6\u51fa\u53d1\uff0c\u5219\u53ef\u4ee5\u5206\u4e3a\u4e24\u79cd\u573a\u666f\uff1a</p>\n<ul>\n<li>Runtime\uff1a\u53ea\u9700\u8981\u5305\u542b\u53ef\u6267\u884c\u7a0b\u5e8f\u548c\u52a8\u6001\u5e93\uff1b</li>\n<li>Development\uff1a\u9664\u4e86 Runtime \u4e2d\u7684\u5185\u5bb9\uff0c\u8fd8\u9700\u8981\u5305\u62ec\u5934\u6587\u4ef6\u3001\u9759\u6001\u5e93\u548c<code>*.cmake</code>\u6587\u4ef6\u3002</li>\n</ul>\n<p>\u8fd9\u4e24\u4e2a\u9009\u9879\u662f\u901a\u8fc7 CMake \u7684<a href=\"https://cmake.org/cmake/help/latest/command/install.html\" rel=\"nofollow\">install</a>\u529f\u80fd\u4e2d\u7684 Componet \u63d0\u4f9b\u7684\uff0c\u5b89\u88c5\u65f6\u9ed8\u8ba4\u90fd\u5b89\u88c5\uff0c\u4e5f\u53ef\u4ee5\u6307\u5b9a\u5b89\u88c5\uff1a</p>\n<pre><code class=\"language-bash\">$ cmake --install build/ --prefix install/ --component KRLibrary_Runtime\n-- Install configuration: \"Release\"\n-- Up-to-date: install/lib/libkrlibrary.so.1.0.0\n-- Up-to-date: install/lib/libkrlibrary.so.1\n</code></pre>\n<p>\u8fd9\u91cc\u989d\u5916\u8bf4\u660e\u4e00\u4e0b\uff0cinstall \u4e2d\u7684 component \u4e0e find_package \u4e2d\u7684\u6ca1\u6709\u4efb\u4f55\u5173\u7cfb\uff0c\u5b8c\u5168\u662f\u6b63\u4ea4\u7684\u6982\u5ff5\u3002\u8fd9\u91cc\u7684\u53ef\u4ee5\u7406\u89e3\u4e3a\u7b80\u5355\u7684\u6253\u4e86\u4e2a\u6807\u7b7e\u65b9\u4fbf\u5b89\u88c5\u65f6\u8fdb\u884c\u9009\u62e9\uff0c\u540d\u5b57\u4e5f\u53ef\u4ee5\u6309\u7167\u81ea\u5df1\u7684\u610f\u56fe\u7f16\u5199\uff0c\u4f8b\u5982\u5e72\u8106\u7ec6\u5206\u6210<code>*_Headers</code>\u3001<code>*_Static</code>\u3001<code>*_Runtime</code>\u7b49\uff0c\u7136\u540e\u6dfb\u52a0\u5230\u5bf9\u5e94\u7ec4\u4ef6\u7684\u5c5e\u6027\u4e2d\u5373\u53ef\u3002</p>\n<p>\u53e6\u4e00\u79cd\u89d2\u5ea6\u662f\u4ece\u9700\u6c42\u89d2\u5ea6\u51fa\u53d1\uff0c\u4f8b\u5982\u53ea\u9700\u8981\u52a8\u6001\u5e93\u6216\u8005\u9759\u6001\u5e93\u4e4b\u4e00\uff0c\u90a3\u4e48\u53ef\u4ee5\u5728\u6784\u5efa\u9636\u6bb5\u8fdb\u884c\u8bbe\u7f6e\uff1a</p>\n<pre><code class=\"language-bash\">cmake -S . -B build/ -DKRLibrary_ENABLE_INSTALL_STATIC=OFF\n</code></pre>\n<p>\u540c\u7406\u53ef\u4ee5\u901a\u8fc7\u9009\u9879<code>KRLibrary_ENABLE_INSTALL_SHARED</code>\u63a7\u5236\u52a8\u6001\u5e93\u7684\u5b89\u88c5\u3002\u8fd9\u4e24\u4e2a\u9009\u9879\u548c\u524d\u8ff0 componets \u4e5f\u662f\u6b63\u4ea4\u7684\u3002</p>\n<h1>\u5176\u4ed6</h1>\n<p>\u63d0\u4f9b\u4e86 Catch2 \u7684\u96c6\u6210\uff0c\u624b\u52a8\u5904\u7406\u4e86\u5b83\u5728\u6784\u5efa\u4e2d\u53ef\u80fd\u9047\u5230\u7684\u4e00\u4e9b\u5c0f\u95ee\u9898\u3002CI \u65b9\u9762\u5219\u7f16\u5199\u4e86\u6bd4\u8f83\u901a\u7528\u7684 Github Action \u811a\u672c\uff0c\u4ee3\u7801\u8986\u76d6\u5206\u6790\u5728 Linux \u548c windows \u5e73\u53f0\u5206\u522b\u4f7f\u7528<a href=\"https://github.com/gcovr/gcovr\" rel=\"nofollow\">gcovr</a>\u548c<a href=\"https://github.com/OpenCppCoverage/OpenCppCoverage\" rel=\"nofollow\">OpenCppCoverage</a>\uff0c\u7f16\u8bd1\u5668\u8b66\u544a\u9009\u9879\u9002\u914d\u4e86 GCC \u3001Clang \u548c MSVC \uff0c\u5e94\u8be5\u8db3\u591f\u5e94\u4ed8\u5927\u90e8\u5206\u5f00\u53d1\u573a\u666f\u4e86\u3002</p>\n<p>\u5b9e\u9645\u4e0a\u8fd8\u5904\u7406\u4e86\u4e00\u4e9b\u6bd4\u8f83\u7ec6\u8282\u7684\u95ee\u9898\uff0c\u4f46\u4e00\u65b9\u9762\u7bc7\u5e45\u6240\u9650\uff0c\u53e6\u4e00\u65b9\u9762\u5149\u662f\u8981\u4ecb\u7ecd\u5176\u5e94\u7528\u573a\u666f\u53ef\u80fd\u5c31\u8981\u60f3\u534a\u5929\uff0c\u9700\u8981\u7684\u4eba\u5c31\u76f4\u63a5\u9605\u8bfb\u6e90\u4ee3\u7801\u5427\uff08\u61d2\uff09\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/FanyFull", 
        "name": "FanyFull", 
        "avatar": "https://cdn.v2ex.com/avatar/113b/978a/555748_large.png?m=1699203313"
      }, 
      "url": "https://www.v2ex.com/t/1117947", 
      "title": "\u6709\u4eba\u9047\u5230\u8fc7 vs2022 c++\u4ee3\u7801\u9ad8\u4eae\u4e0d\u751f\u6548\u7684\u95ee\u9898\u5417\uff1f", 
      "id": "https://www.v2ex.com/t/1117947", 
      "date_published": "2025-03-12T11:41:56+00:00", 
      "content_html": "<p>\u7a81\u7136\u6709\u4e00\u5929\u6253\u5f00 vs2022 \u5c31\u53d8\u6210\u4e86\u73b0\u5728\u8fd9\u4e2a\u6837\u5b50\uff0c\u600e\u4e48\u8c03\u4e5f\u6ca1\u7528\u3002\u6bd4\u5982\uff0cc++ \u7684\u6ce8\u91ca\uff0c\u539f\u6765\u662f\u6e32\u67d3\u6210\u7eff\u8272\u7684\uff0c\u7ed3\u679c\u73b0\u5728\u989c\u8272\u5168\u90fd\u6d88\u5931\u4e86\u3002\u5982\u4e0b\u56fe\u6240\u793a\uff0c</p>\n<p><img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://i.ibb.co/V0VDC3CQ/image.png\"/></p>\n<p><img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://i.ibb.co/zTpt79Kj/image.png\"/></p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/cnbatch", 
        "name": "cnbatch", 
        "avatar": "https://cdn.v2ex.com/gravatar/7eb06cdf719fb364a1dfbbaefc4f9d36?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1117106", 
      "title": "\u4f7f\u7528 C++20 \u534f\u7a0b\u4e0e ASIO \u5e93\u5199\u4e86\u4e2a Socks5 Server \u7684\u8de8\u5e73\u53f0 Demo \u7a0b\u5e8f\uff0c\u51e0\u4e4e\u5168\u529f\u80fd\uff0c\u5355\u6587\u4ef6\u6e90\u7801\u5c11\u4e8e\u4e00\u5343\u884c", 
      "id": "https://www.v2ex.com/t/1117106", 
      "date_published": "2025-03-09T15:51:59+00:00", 
      "content_html": "<p>\u6e90\u7801\u5df2\u7ecf\u53d1\u5e03\u5728 Github\uff1a\n<a href=\"https://github.com/cnbatch/cpp20-socks5demo\" rel=\"nofollow\">https://github.com/cnbatch/cpp20-socks5demo</a></p>\n<p>RFC 1928 \u8981\u6c42\u7684\u529f\u80fd\u51e0\u4e4e\u90fd\u5b9e\u73b0\u4e86\u3002</p>\n<h2>\u652f\u6301\u7684\u529f\u80fd\uff1a</h2>\n<ul>\n<li>IPv4</li>\n<li>IPv6</li>\n<li>\u2018No Auth\u2019 \u8ba4\u8bc1\u6a21\u5f0f</li>\n<li>\u7528\u6237\u540d / \u5bc6\u7801 \u8ba4\u8bc1\u6a21\u5f0f</li>\n<li>TCP <code>Connect</code></li>\n<li>TCP <code>BIND</code></li>\n<li>UDP <code>Associate</code></li>\n</ul>\n<h2>\u672a\u5b9e\u73b0\u7684\u529f\u80fd\uff1a</h2>\n<ul>\n<li>GSSAPI \u8ba4\u8bc1\u6a21\u5f0f</li>\n</ul>\n<p>Socks5 \u6807\u51c6 (RFC 1928) \u5199\u7740\u5fc5\u987b\u5b9e\u73b0\u8fd9\u4e2a\u529f\u80fd\uff0c\u7136\u800c\u6211\u505a\u7684\u53ea\u662f\u4e2a Demo \u7a0b\u5e8f\uff0c\u5e73\u65f6\u4e5f\u7528\u4e0d\u5230 GSSAPI \uff0c\u4e3a\u4e86\u7b80\u5355\u8d77\u89c1\u5c31\u4e0d\u5b9e\u73b0\u4e86\u3002</p>\n<h2>\u5df2\u5728\u8fd9\u4e9b\u7cfb\u7edf\u6d4b\u8bd5\u8fc7\uff1a</h2>\n<ul>\n<li>Windows 11 + VS2022</li>\n<li>FreeBSD 13.4</li>\n<li>FreeBSD 14.2</li>\n<li>Debian 12</li>\n</ul>\n<hr/>\n<h2>\u7528\u534f\u7a0b\u5199\u4ee3\u7801\u7684\u4f53\u9a8c</h2>\n<p>\u7528\u4e86\u534f\u7a0b\u4e4b\u540e\uff0c\u601d\u8def\u6e05\u6670\u591a\u4e86\uff0c\u4e0d\u50cf callback \u65f6\u90a3\u4e48\u5934\u5927\uff0c\u76f8\u5bf9\u800c\u8a00\u8f7b\u677e\u591a\u4e86\u3002</p>\n<h2>Github \u5c31\u6709\u4e00\u5927\u5806 Socks5 Server \u7a0b\u5e8f\uff0c\u4e3a\u4ec0\u4e48\u53c8\u9020\u4e86\u4e2a\u65b0\u7684\uff1f</h2>\n<p>\u4e24\u5927\u539f\u56e0\uff1a</p>\n<ol>\n<li>\n<p>\u6211\u81ea\u5df1\u662f Windows + FreeBSD \u7528\u6237\uff0c\u6b63\u597d\u9700\u8981\u8fd9\u6837\u7684 socks5 server \u7a0b\u5e8f\u2014\u2014\u53ef\u4ee5\u540c\u65f6\u5728 Windows \u4e0e FreeBSD \u8fd0\u884c\uff0c\u80fd\u591f\u652f\u6301 TCP + UDP, IPv4 + IPv6 \uff0c\u4f7f\u7528\u76f8\u540c\u7684\u8fd0\u884c\u914d\u7f6e\u65b9\u5f0f\u3002<br/>\u867d\u7136\u5e73\u65f6 socks5 server \u4e3b\u8981\u5728 FreeBSD \u5f53\u4e2d\u8fd0\u884c\uff0c\u4f46\u7a33\u59a5\u8d77\u89c1\u4e5f\u8981\u5728 Windows \u53f0\u5f0f\u673a\u8fd0\u884c\u540c\u6837\u7684\u7a0b\u5e8f\uff0c\u7528\u4f5c backup \u65b9\u6848\u3002<br/>\u6700\u91cd\u8981\u7684\u4e00\u70b9\uff0c\u4e24\u4e2a\u5e73\u53f0\u90fd\u8981\u91c7\u7528 Native \u7f16\u8bd1\u65b9\u5f0f\uff0c\u800c\u4e0d\u662f\u5355\u7eaf\u7684\u201c\u59a5\u534f\u201d\u7f16\u8bd1\u65b9\u5f0f\u3002\u76f4\u767d\u70b9\u8bf4\u5c31\u662f\uff1a</p>\n<ul>\n<li>Windows \u53ef\u4ee5\u7528 MSVC \u76f4\u63a5\u7f16\u8bd1\uff0c\u4e0d\u9700\u8981\u7ecf\u8fc7 Cygwin / MinGW \u7ed5\u4e00\u5c42\u3002</li>\n<li>FreeBSD \u53ef\u4ee5\u7528\u5185\u7f6e\u7f16\u8bd1\u5668 + BSD Make \u76f4\u63a5\u7f16\u8bd1\uff08\u5373\u4f7f\u662f cmake \u751f\u6210\u7684\uff09\uff0c\u4e0d\u9700\u8981 GNU Make \uff0c\u4e0d\u9700\u8981\u989d\u5916\u518d\u5b89\u88c5\u7f16\u8bd1\u5668\u3002</li>\n</ul>\n</li>\n<li>\n<p>\u4e00\u76f4\u60f3\u8bd5\u8bd5 ASIO \u5e93\u7684\u534f\u7a0b\u6a21\u5f0f\uff0c\u6bd5\u7adf\u5199\u8d77\u6765\u6d41\u7545\u591a\u4e86\u3002\u6211\u4e2a\u4eba\u8bb0\u5fc6\u529b\u4e0d\u592a\u597d\uff0ccallback \u6570\u91cf\u4e00\u591a\u5c31\u5934\u5927\uff0c\u5b9e\u5728\u8bb0\u4e0d\u8fc7\u6765\u3002\u8d81\u7740\u6709\u9700\u6c42\uff0c\u6b63\u597d\u62ff\u6765\u8bd5\u4e00\u8bd5\u3002</p>\n</li>\n</ol>\n<h2>\u5c0f\u63d0\u793a</h2>\n<p>\u7531\u4e8e\u8fd9\u4e2a\u7a0b\u5e8f\u53ea\u662f\u4e2a Demo \uff0c<strong>\u7528\u662f\u80fd\u7528</strong>\u3002\u53ea\u4e0d\u8fc7\u6682\u65f6\u4e0d\u652f\u6301\u4fa6\u542c\u5230\u5177\u4f53\u7684\u5730\u5740\uff0c\u4e0d\u63d0\u4f9b\u65e5\u5fd7\u8bb0\u5f55\uff0c\u8fde\u63a5\u8d85\u65f6\u7684\u65f6\u95f4\u5224\u65ad\u662f\u786c\u7f16\u7801\u7684\u3002\u5982\u679c\u8981\u5176\u4ed6\u989d\u5916\u529f\u80fd\u90fd\u5b9e\u73b0\u7684\u8bdd\uff0c\u5c31\u4e0d\u80fd\u5355\u9760\u4e00\u4e2a\u6e90\u6587\u4ef6\u4e86\uff0c\u53ea\u80fd\u53e6\u5f00\u65b0 repo \u628a\u5404\u90e8\u4efd\u62c6\u5f00\u6765\u91cd\u65b0\u68b3\u7406\u4e00\u904d\u3002\u4ee5\u540e\u518d\u5728\u65b0 repo \u5185\u6162\u6162\u62c6\u3001\u6162\u6162\u8865\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/slideclick", 
        "name": "slideclick", 
        "avatar": "https://cdn.v2ex.com/gravatar/1246f151818c2aad0cc0dc36f19b8197?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1116327", 
      "title": "\u5c0f\u4f17\u8bba\u575b\u95ee\u4e2a\u597d\u5947\u7684\u95ee\u9898\u5173\u4e8e c++", 
      "id": "https://www.v2ex.com/t/1116327", 
      "date_published": "2025-03-06T04:36:59+00:00", 
      "content_html": "<p>\u6df1\u5165\u6d45\u51fa mfc \u7684\u4f5c\u8005\n\u6211\u770b\u5728\u67d0\u7ad9\u5f00\u4e86\u53f7\u8bb2 c++\n\u6211\u6ca1\u6709\u770b\uff0c\u770b\u89c6\u9891\u6807\u9898\u611f\u89c9\u662f c++98 \u7684\u6c34\u5e73\n\u770b\u4e86\u7684\u77e5\u9053\u4e48\uff1f</p>\n<p>\u8fd9\u53ef\u662f 22 \u5e74\u7684\u89c6\u9891</p>\n<p>\u96be\u9053\u6211\u9519\u4e86\uff0c\u8fd8\u662f\u4ed6\u4e0d\u5b66\u4e60\uff1f</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/slideclick", 
        "name": "slideclick", 
        "avatar": "https://cdn.v2ex.com/gravatar/1246f151818c2aad0cc0dc36f19b8197?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1116281", 
      "title": "\u5e02\u9762\u4e0a\u5927\u90e8\u5206 c++\u7a0b\u5e8f\u5458\u90fd\u5728 c++98 \u6c34\u5e73\u5427\uff1f", 
      "id": "https://www.v2ex.com/t/1116281", 
      "date_published": "2025-03-06T02:53:19+00:00", 
      "content_html": "<p>\u4e0d\u662f\u6765\u8e22\u9986\u7684\uff0c\u6211\u8001 c++\u7a0b\u5e8f\u5458\uff0c\u5728\u5b66\u4e60 c++20</p>\n<p>\u8fd9\u8bdd\u9898\u8d34\u522b\u7684\u8bba\u575b\u6ca1\u4eba\u770b</p>\n<p>\u5927\u90e8\u5206\u4eba\u5ba3\u79f0\u4f1a c++\uff0c\u5176\u5b9e\u90fd\u662f C</p>\n<p>c++98 \u662f\u4ec0\u4e48\u6c34\u5e73\uff1f\n\u5c31\u662f\u9700\u8981\u4e00\u5927\u7247 n \u4e2a\u5bf9\u8c61\u7684\u5185\u5b58\uff0c\u4f7f\u7528 vector \u800c\u4e0d\u662f new[n]\n\u53ef\u662f\u6211\u731c\u5f88\u591a\u9762\u8bd5\u5b98\u7684\u63d0\u95ee\u90fd\u662f delete[]\u800c\u4e0d\u662f delete \u624d\u80fd\u548c new[]\u914d\u5bf9</p>\n<p>\u8fd9\u9762\u8bd5\u5b98\u81ea\u5df1\u90fd\u6ca1\u6709\u8fbe\u5230 98 \u6c34\u5e73</p>\n<p>\u8fd9\u70c2\u95ee\u9898\u5c31\u4e0d\u8be5\u95ee\u4e86</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/jdz", 
        "name": "jdz", 
        "avatar": "https://cdn.v2ex.com/gravatar/9c4465d38ccf3c91d8aec7faef152292?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1110662", 
      "date_modified": "2025-02-11T11:32:34+00:00", 
      "content_html": "<p>std::map&lt;std::string, std::string&gt; a;\nstd::string m = 2;  //\u7f16\u8bd1\u5931\u8d25\na[\"hello\"] = 1;  //\u7f16\u8bd1\u6210\u529f\n\u4e3a\u4ec0\u4e48\u5462</p>\n", 
      "date_published": "2025-02-11T07:22:24+00:00", 
      "title": "cpp \u4e00\u4e2a\u9690\u5f0f\u8f6c\u6362\u5947\u602a\u7684\u73b0\u8c61", 
      "id": "https://www.v2ex.com/t/1110662"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Amose2024", 
        "name": "Amose2024", 
        "avatar": "https://cdn.v2ex.com/avatar/2dc8/6190/684784_large.png?m=1736382177"
      }, 
      "url": "https://www.v2ex.com/t/1109496", 
      "date_modified": "2025-02-07T03:25:28+00:00", 
      "content_html": "<p>\u5728 B \u7ad9\u627e C++\u81ea\u5b66\u8def\u7ebf\uff0c\u6709\u7684 UP \u4e3b\u5305\u62ec 01 \u661f\u7403\u7b49\uff0c\u63a8\u8350\u4e66\u7c4d\u300a C++ Primer Plus \u300b\u3002\u6211\u4e70\u56de\u6765\u4e0a\u4e0b\u4e24\u518c\uff0c\u5de8\u539a\u3002\n\u4e0a\u518c\u76ee\u524d\u770b\u4e86\u4e24\u767e\u9875\u3002</p>\n<p>\u6211\u53d1\u73b0\u8fd9\u4e66\u7684\u69fd\u70b9\u6709\u4e24\u70b9\uff1a\n\u7b2c\u4e00\u70b9\u662f\u4e66\u4e2d\u660e\u786e\u8bf4\u5bf9\u4e8e\u521d\u5b66\u8005\u4e0d\u9700\u8981 C \u8bed\u8a00\u57fa\u7840\uff0c\u6216\u8005\u5176\u5b83\u8bed\u8a00\u57fa\u7840\u3002\u4f46\u662f\u5b83\u4e00\u518d\u63d0\u53ca\u5176\u5b83\u8bed\u8a00\uff08\u6709\u4e9b\u662f\u6ca1\u6709\u89c1\u8fc7\u7684\u8bed\u8a00\uff09\uff0c\u751a\u81f3\u5927\u7bc7\u5e45\u8bb2 C \u8bed\u8a00\u8bed\u6cd5\uff0c\u793a\u4f8b\u91cc C \u8bed\u8a00\u548c C++\u6df7\u7528\uff0c\u770b\u4e86\u4e4b\u540e\u5408\u4e0a\u4e66\u987f\u65f6\u5206\u4e0d\u6e05\u54ea\u4e2a\u662f C \u7684\uff0c\u54ea\u4e2a\u662f C++\u7684\u3002\u5bf9\u4e8e\u6ca1 C \u8bed\u8a00\u57fa\u7840\u7684\u4eba\u6765\u8bf4\uff0c\u5c24\u5176\u75db\u82e6\u3002</p>\n<p>\u7b2c\u4e8c\u70b9\u662f\u91cd\u70b9\u7684\u5730\u65b9\u4e0d\u8bb2\u6df1\uff0c\u51e0\u53e5\u8bdd\u5e26\u8fc7\u53bb\u4e86\uff0c\u800c\u4e0d\u91cd\u8981\u7684\u5730\u65b9\u5e9f\u8bdd\u771f\u662f\u591a\u3002</p>\n<p>\u5f53\u65f6 B \u7ad9\u7684\u4eba\u63a8\u8350\u7406\u7531\u662f C++ Primer \u66f4\u6df1\uff0c\u4e0d\u9002\u5408\u521d\u5b66\u8005\uff0c\u63a8\u8350 C++ Primer Plus \u3002</p>\n<p>\u540e\u6094\u5f53\u65f6\u6ca1\u6709\u5728\u5916\u7f51\u53bb\u6536\u96c6\u8fd9\u4e24\u672c\u4e66\u7684\u4e0d\u540c\u4e4b\u5904\uff0c\u5916\u7f51\u9a82\u540e\u8005\u662f\u5783\u573e\u4e66\u7c4d\u7684\u53ef\u591a\u4e86\u3002\u3002\u3002</p>\n<p>\u8fd9\u4e24\u672c\u4e66\u5b8c\u5168\u4e0d\u662f\u540c\u4e00\u7ea7\u522b\uff0cPrimer \u66f4\u597d\uff0cPlus \u662f shit!</p>\n<p>\u5c31\u5410\u69fd\u4e00\u4e0b\uff0c\u770b\u5b8c\u8fd8\u662f\u8981\u770b\u5b8c\u7684\u3002</p>\n", 
      "date_published": "2025-02-07T01:04:26+00:00", 
      "title": "C++\u5165\u95e8\u4e66\u7c4d\uff0c\u6211\u662f\u4e0d\u662f\u88ab\u5751\u4e86\uff1f", 
      "id": "https://www.v2ex.com/t/1109496"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/rednose1037", 
        "name": "rednose1037", 
        "avatar": "https://cdn.v2ex.com/gravatar/12f3b888c5118e595556e05ba93df0e8?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1108491", 
      "date_modified": "2025-02-01T02:41:02+00:00", 
      "content_html": "<p><img alt=\"image.png\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://s2.loli.net/2025/02/01/fEKl3H4RaAZNmg6.png\"/></p>\n<ul>\n<li>mac \u4e0d\u7ef4\u62a4 gdb \uff0c\u4e0d\u60f3\u624b\u52a8\u914d\u7f6e\u7279\u5b9a\u7248\u672c\uff1b\u9ed8\u8ba4\u4f7f\u7528 libc++\uff0c\u6211\u6539\u6210 libstdc++,</li>\n</ul>\n<pre><code>set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -stdlib=libstdc++ -I/opt/homebrew/Cellar/gcc/13.2.0/include/c++/13.2.0 -I/opt/homebrew/Cellar/gcc/13.2.0/include/c++/13.2.0/aarch64-apple-darwin23.4.0\")\n</code></pre>\n<ul>\n<li>\u4e00\u5927\u5806\u627e\u4e0d\u5230 stl \u62a5\u9519\uff0c\u8def\u5f84\u786e\u8ba4\u6ca1\u95ee\u9898\uff0c\u6ca1\u641e\u6765</li>\n<li>\u7d2f\u4e86\uff0c\u3002\u3002\u3002\u6362 ide \u5c31\u4e0d\u7528\u5efa\u8bae\u4e86\uff0c\u5c31\u60f3\u77e5\u9053 mac clion \u8fd9\u4e2a\u591f\u5427 \u8c03\u8bd5\u600e\u4e48\u624d\u80fd\u770b stl \u7684\u503c...</li>\n</ul>\n", 
      "date_published": "2025-02-01T02:40:47+00:00", 
      "title": "mac clion \u8c03\u8bd5\u600e\u4e48\u624d\u80fd\u770b\u5230 stl \u5bb9\u5668\u7684\u503c", 
      "id": "https://www.v2ex.com/t/1108491"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/winskyme", 
        "name": "winskyme", 
        "avatar": "https://cdn.v2ex.com/gravatar/3295bc66f2dcb15d182a25cda9157ce7?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1107860", 
      "title": "\u6709\u6ca1\u6709\u5408\u9002\u5f00\u6e90\u7684 C++\u9879\u76ee\u53ef\u4ee5\u5feb\u901f\u5b9e\u73b0\u4e00\u4e9b\u529f\u80fd", 
      "id": "https://www.v2ex.com/t/1107860", 
      "date_published": "2025-01-25T15:36:47+00:00", 
      "content_html": "\u4e00\u4e2a\u7b80\u5355\u4f46\u53ef\u9760\u7684 linux C++\u670d\u52a1\u7aef\uff1a<br /><br />1 \uff0c\u901a\u8fc7 http \u6216\u8005 tcp \u63a5\u6536\u5ba2\u6237\u7aef\u53d1\u8fc7\u6765\u7684 json \u683c\u5f0f\u7684\u6570\u636e<br />2 \uff0c\u652f\u6301\u89e3\u6790\u3001\u4fee\u6539 json \u683c\u5f0f\u7684\u6570\u636e\uff0c\u6839\u636e json \u91cc\u67d0\u4e9b\u5b57\u6bb5\u7684\u5185\u5bb9\uff0c\u53bb\u6570\u636e\u5e93\u518d\u53bb\u67e5\u4e00\u4e9b\u4fe1\u606f\uff0c\u8865\u5145\u8fdb json \u6570\u636e\u4e2d<br />3 \uff0c\u5c06\u8fd9\u4e9b json \u683c\u5f0f\u7684\u6570\u636e\u4fdd\u5b58\u5728\u4efb\u52a1\u961f\u5217\u4e2d\uff0c\u652f\u6301\u6839\u636e json \u6570\u636e\u91cc\u7684\u8ba1\u7b97\u7c7b\u578b\u5b57\u6bb5\uff0c\u5212\u5206\u591a\u4e2a\u4efb\u52a1\u961f\u5217\uff0c\u652f\u6301\u961f\u5217\u7684\u67e5\u770b\u3001\u7ba1\u7406\uff1b\u5c06\u961f\u5217\u4e2d\u7684\u4fe1\u606f\u8f6e\u8be2\u53d1\u9001\u7ed9\u5404\u4e2a\u8ba1\u7b97\u8282\u70b9\uff0c\u8282\u70b9\u8ba1\u7b97\u5b8c\u6210\u540e\u518d\u53d1\u4e0b\u4e00\u4e2a<br />4 \uff0c\u63a5\u6536\u8ba1\u7b97\u8282\u70b9\u8fd4\u56de\u7684 json \u683c\u5f0f\u8ba1\u7b97\u7ed3\u679c\uff0c\u5e76\u5199\u5165\u6307\u5b9a\u7684\u6570\u636e\u5e93<br />5 \uff0c\u652f\u6301\u548c\u5404\u4e2a\u8ba1\u7b97\u8282\u70b9\u7684\u5fc3\u8df3\u62a5\u6587\uff0c\u4ee5\u611f\u77e5\u8ba1\u7b97\u8282\u70b9\u7684\u72b6\u6001\u3001\u5f53\u524d\u662f\u5426\u6709\u8ba1\u7b97\u4efb\u52a1<br />6 \uff0c\u652f\u6301\u76d1\u542c\u7aef\u53e3\u3001\u6570\u636e\u5e93\u5730\u5740\u3001\u5ba2\u6237\u7aef IP \u4ece\u914d\u7f6e\u6587\u4ef6\u4e2d\u8bfb\u53d6"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/dy416394356y78", 
        "name": "dy416394356y78", 
        "avatar": "https://cdn.v2ex.com/gravatar/ed00e0a696f5cd8d0ceb92e2b1062af4?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1107538", 
      "title": "\u7528 c++\u5b9e\u73b0 bluez \u5bf9\u4e8e 31 \u4e2a\u5b57\u8282\u84dd\u7259\u5e7f\u64ad\u9650\u5236\u7684\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1107538", 
      "date_published": "2025-01-24T03:27:22+00:00", 
      "content_html": "\u5404\u4f4d\u5927\u4f6c\u597d\uff0c\u73b0\u9047\u5230\u4e00\u4e2a\u95ee\u9898\uff0c\u6073\u8bf7\u5927\u5bb6\u6307\u4e00\u6761\u660e\u8def<br /><br />\u6211\u7684\u9700\u6c42:\u6211\u7684\u677f\u5b50\u5f00\u673a\u540e\u4f1a\u84dd\u7259\u5e7f\u64ad\uff0capp \u63a5\u6536\u5e7f\u64ad\u540e\u53ef\u4ee5\u76f4\u63a5\u8bc6\u522b\u8be5\u677f\u5b50\u7684\u578b\u53f7\uff0c\u76ee\u524d\u5df2\u7ecf\u5e7f\u64ad\u7684\u6570\u636e\u6709\u6807\u5fd7\u4f4d\uff0cUUID \u548c\u84dd\u7259\u5e7f\u64ad\u540d\u5b57\uff0c\u5df2\u7ecf\u5360\u7528\u4e86 29 \u5b57\u8282\uff0c\u6211\u67e5\u5230\u84dd\u7259\u5e7f\u64ad\u9650\u5236 31 \u4e2a\u5b57\u8282\uff0c\u6211\u76f4\u63a5\u62fc\u63a5\u5728\u6570\u636e\u540e\u9762\u5e7f\u64ad\uff0cnRF \u4f1a\u76f4\u63a5\u62a5 none \uff0c\u5373\u80fd\u626b\u63cf\u5230\u4f46\u662f\u6ca1\u6709\u6570\u636e<br /><br />\u76ee\u524d\u6211\u7684\u84dd\u7259\u6a21\u5757\u662f 4.1 \u7684 hci \uff0c\u4e0d\u652f\u6301\u62d3\u5c55\u6570\u636e<br />\u67e5\u5230\u7f51\u4e0a\u53ef\u4ee5\u4f7f\u7528\u5206\u5305\uff0c\u6216\u8005\u52a0\u5165\u626b\u63cf\u6570\u636e\u4e2d\uff0c\u4f46\u662f\u8fd9\u6837\u90fd\u65e0\u6cd5\u5728\u5e7f\u64ad\u7684\u65f6\u5019\uff0c\u63a5\u6536\u65b9\u5c31\u7acb\u523b\u6536\u5230\u6570\u636e\u8fdb\u884c\u8bc6\u522b\uff0c\u5206\u5305\u9700\u8981\u6536\u5230\u4e24\u4e2a\u5305\uff0c\u800c\u52a0\u5165\u626b\u63cf\u6570\u636e\u9700\u8981\u6536\u5230\u5e7f\u64ad\u5efa\u7acb\u8fde\u63a5\u540e\u624d\u53ef\u4ee5<br /><br />\u8fd8\u6709\u6ca1\u6709\u4ec0\u4e48\u522b\u7684\u529e\u6cd5\uff1f<br /><br />\u611f\u8c22\u3002"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/yuzhixin411416", 
        "name": "yuzhixin411416", 
        "avatar": "https://cdn.v2ex.com/gravatar/2f62983d2a18826e100501792bc290a1?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1106524", 
      "date_modified": "2025-01-20T09:46:47+00:00", 
      "content_html": "<p>\u6211\u60f3\u505a\u4e2a\u5c11\u513f\u7f16\u7a0b\u7f51\u7ad9</p>\n<p>\u6700\u57fa\u7840\u7684\u529f\u80fd\u662f\u80fd\u591f\u505a\u5230\u5728\u7ebf\u8fd0\u884c c++\u4ee3\u7801\uff0c\u8f93\u5165\u8f93\u51fa\u80fd\u591f\u52a8\u6001\u6301\u7eed\u7684\u8fdb\u884c</p>\n<p>\u8fd9\u79cd\u90fd\u7528\u4ec0\u4e48\u65b9\u6848\u5440</p>\n<p>\u7c7b\u4f3c\u5b66\u800c\u601d\u7684\u5c0f\u7334\u7f16\u7a0b\uff1a <a href=\"https://www.xiaohoucode.com/\" rel=\"nofollow\">https://www.xiaohoucode.com/</a></p>\n", 
      "date_published": "2025-01-20T08:14:27+00:00", 
      "title": "\u5bfb\u627e\u4e00\u4e2a\u5728\u7ebf\u8fd0\u884c c++\u7684\u65b9\u6848", 
      "id": "https://www.v2ex.com/t/1106524"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/aqtata", 
        "name": "aqtata", 
        "avatar": "https://cdn.v2ex.com/avatar/be60/9f31/171110_large.png?m=1764074284"
      }, 
      "url": "https://www.v2ex.com/t/1105424", 
      "date_modified": "2025-01-16T00:44:09+00:00", 
      "content_html": "<p>\u8fd0\u884c\u65f6\u4ece\u5916\u90e8\u8bfb\u53d6\u4e00\u4e2a 16 \u8fdb\u5236\u6570\u5b57\uff0c\u7136\u540e\u8c03\u7528\u5bf9\u5e94\u7684\u51fd\u6570\uff0c\u6bd4\u5982\u8bfb\u53d6\u5230<code>1F3</code>\uff0c\u90a3\u4e48\u5c31\u8c03\u7528\u51fd\u6570<code>foo_1f3</code>\uff0c\u51fd\u6570\u53c2\u6570\u4e5f\u662f\u6709\u7f16\u53f7\u7684\uff0c\u89c4\u5f8b\u662f\u8fd9\u6837\uff1a</p>\n<pre><code class=\"language-c++\">void foo_1f0(myclass_1f0&amp; val);\nvoid foo_1f1(myclass_1f1&amp; val);\nvoid foo_1f2(myclass_1f2&amp; val);\n</code></pre>\n<p>\u4e4b\u524d C#\u662f\u7528\u7684\u53cd\u5c04\uff0c\u5f88\u5bb9\u6613\u5b9e\u73b0\u3002\u5230 C++\u8fd9\u4e0d\u77e5\u9053\u600e\u4e48\u641e\u6bd4\u8f83\u4f18\u96c5\uff0c\u76ee\u524d\u6709\u4e0a\u767e\u4e2a if/else \u53bb\u5224\u65ad\u7136\u540e\u8c03\u7528\u3002</p>\n<p>C++\u8fd9\u8fb9\u53ef\u4ee5\u7528\u5230 C++20 \uff0c\u4e0d\u77e5\u9053\u6709\u4ec0\u4e48\u9177\u7684\u89e3\u51b3\u65b9\u6cd5\uff1f</p>\n", 
      "date_published": "2025-01-16T00:43:29+00:00", 
      "title": "\u8fd9\u79cd\u60c5\u51b5\u5982\u4f55\u6d88\u9664\u51e0\u767e\u4e2a if/else", 
      "id": "https://www.v2ex.com/t/1105424"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/aqtata", 
        "name": "aqtata", 
        "avatar": "https://cdn.v2ex.com/avatar/be60/9f31/171110_large.png?m=1764074284"
      }, 
      "url": "https://www.v2ex.com/t/1104863", 
      "title": "cmake + googletest \u7684\u76ee\u5f55\u7ed3\u6784\u6700\u4f73\u5b9e\u8df5\u662f\uff1f", 
      "id": "https://www.v2ex.com/t/1104863", 
      "date_published": "2025-01-14T00:47:47+00:00", 
      "content_html": "<p>\u76ee\u524d\u770b\u5230\u6709\u51e0\u79cd\u505a\u6cd5\uff1a</p>\n<ol>\n<li>\u6d4b\u8bd5\u4ee3\u7801\u5728\u6e90\u7801\u4e2d\uff0c\u901a\u8fc7\u5b8f\u533a\u5206\u7f16\u8bd1\u3002</li>\n<li>\u6d4b\u8bd5\u4ee3\u7801\u5728\u5de5\u7a0b\u76ee\u5f55\u4e0b\u7684 test \u6587\u4ef6\u5939\u4e2d\uff0c\u5f15\u5165\u88ab\u6d4b\u7684\u6e90\u6587\u4ef6\u7f16\u8bd1\u6d4b\u8bd5\u3002</li>\n<li>\u628a\u88ab\u6d4b\u4ee3\u7801\u7f16\u8bd1\u6210\u9759\u6001\u5e93\uff0c\u5728\u9876\u5c42\u76ee\u5f55\u4e0b\u6709\u4e2a tests \u6587\u4ef6\u5939\uff0c\u94fe\u63a5\u9759\u6001\u5e93\u6d4b\u8bd5\u3002</li>\n</ol>\n<p>\u5404\u4f4d\u600e\u4e48\u7ec4\u7ec7\u7684\uff1f</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/zcion", 
        "name": "zcion", 
        "avatar": "https://cdn.v2ex.com/gravatar/01be0b4e4d10c4d12ed83ef0a87bcebd?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1096242", 
      "title": "\u4e3a\u4ec0\u4e48\u6253\u5370\u6a21\u677f\u5143\u7f16\u7a0b\u8ba1\u7b97\u9636\u4e58\u7ed3\u679c\uff0c\u6bd4\u6253\u5370 for \u5faa\u73af\u8ba1\u7b97\u9636\u4e58\u7ed3\u679c\u66f4\u8017\u65f6", 
      "id": "https://www.v2ex.com/t/1096242", 
      "date_published": "2024-12-09T13:22:23+00:00", 
      "content_html": "<p>\u6700\u8fd1\u770b\u4e86 <code>effective c++</code> \u8fd9\u672c\u4e66\uff0c\u4e66\u4e2d\u6709\u4e00\u79cd\u7528\u6a21\u677f\u5143\u7f16\u7a0b\u8ba1\u7b97\u9636\u4e58\u7684\u9a9a\u64cd\u4f5c\uff0c\u8bf4\u662f\u53ef\u4ee5\u5c06\u8ba1\u7b97\u4ece\u8fd0\u884c\u65f6\u8f6c\u5230\u7f16\u8bd1\u671f\u95f4\uff0c\u8fd9\u6837\u53ef\u4ee5\u63d0\u9ad8\u4ee3\u7801\u7684\u6267\u884c\u6548\u7387\u3002</p>\n<p>\u4f46\u6211\u5c1d\u8bd5\u4e86\u4e0b\uff0c\u53d1\u73b0\u5e76\u6ca1\u6709\u6bd4\u4f7f\u7528 for \u5faa\u73af\u8ba1\u7b97\u9636\u4e58\u7684\u65b9\u6cd5\u5feb\uff0c\u53cd\u800c\u82b1\u8d39\u4e86\u66f4\u591a\u7684\u65f6\u95f4\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a</p>\n<pre><code class=\"language-cpp\">#include &lt;chrono&gt;\n#include &lt;cstdlib&gt;\n#include &lt;iostream&gt;\n#include &lt;new&gt;\n#include &lt;vector&gt;\n\nusing std::size_t;\n\ntemplate &lt;unsigned x&gt;\nstruct fac {\n    static const size_t value = x * fac&lt;x - 1&gt;::value;\n};\n\ntemplate &lt;&gt;\nstruct fac&lt;1&gt; {\n    static const size_t value = 1;\n};\n\n// for \u5faa\u73af\u8ba1\u7b97\u9636\u4e58\nsize_t fori(size_t v) {\n    size_t tmp = 1;\n    for (size_t i = 1; i &lt;= v; i++) {\n        tmp = tmp * i;\n    }\n    return tmp;\n}\n\n// \u5229\u7528\u6a21\u677f\u5143\u7f16\u7a0b\u8ba1\u7b97\u9636\u4e58\nconstexpr size_t facc() { return fac&lt;901&gt;::value; }\n\nvoid func() {\n    // \u6a21\u677f\u5143\u7f16\u7a0b\u8ba1\u7b97\u8017\u65f6\n    auto start = std::chrono::high_resolution_clock::now();\n\n    constexpr auto tmp = facc();\n    std::cout &lt;&lt; tmp &lt;&lt; std::endl;\n\n    auto end = std::chrono::high_resolution_clock::now();\n    auto duration =\n        std::chrono::duration_cast&lt;std::chrono::nanoseconds&gt;(end - start);\n    std::cout &lt;&lt; \"Elapsed time: \" &lt;&lt; duration.count() &lt;&lt; \" ns\"\n              &lt;&lt; std::endl;  // \u8f93\u51fa 57466 ns\n\n    // for \u5faa\u73af\u8ba1\u7b97\u8017\u65f6\n    auto start1 = std::chrono::high_resolution_clock::now();\n\n    size_t t = fori(901);\n    std::cout &lt;&lt; tmp &lt;&lt; std::endl;\n\n    auto end1 = std::chrono::high_resolution_clock::now();\n    auto duration1 =\n        std::chrono::duration_cast&lt;std::chrono::nanoseconds&gt;(end1 - start1);\n    std::cout &lt;&lt; \"Elapsed time: \" &lt;&lt; duration1.count() &lt;&lt; \" ns\"\n              &lt;&lt; std::endl;  // \u8f93\u51fa 1647 ns\n}\n\nint main() { func(); }\n</code></pre>\n<p>\u5982\u679c\u53bb\u6389\u6253\u5370\uff0c\u53cd\u800c\u662f\u5229\u7528\u6a21\u677f\u5143\u7f16\u7a0b\u7684\u66f4\u5feb\uff0c\u786e\u5b9e\u7b26\u5408\u7f16\u8bd1\u671f\u8ba1\u7b97\u63d0\u9ad8\u6548\u7387\u7684\u8bf4\u6cd5\uff0c\u4f46\u8fd9\u91cc\u6253\u5370\u4e86\u5176\u7ed3\u679c\uff0c\u53cd\u800c\u82b1\u8d39\u4e86\u66f4\u591a\u65f6\u95f4\u3002</p>\n<p>\u8fd9\u662f\u4e3a\u4ec0\u4e48\uff0c\u662f\u7f16\u8bd1\u5668\u81ea\u4e2a\u7684\u4f18\u5316\u7b56\u7565\u95ee\u9898\u8fd8\u662f\u4ec0\u4e48\uff1f</p>\n<p>\u7f16\u8bd1\u5668\u7248\u672c\uff1agcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/zsxzy", 
        "name": "zsxzy", 
        "avatar": "https://cdn.v2ex.com/avatar/6ced/5cd3/225840_large.png?m=1750605867"
      }, 
      "url": "https://www.v2ex.com/t/1095980", 
      "title": "Asio \u5f02\u6b65\u6a21\u578b", 
      "id": "https://www.v2ex.com/t/1095980", 
      "date_published": "2024-12-09T00:28:37+00:00", 
      "content_html": "<p>\u4e00\u4efd\u5f88\u4e0d\u9519\u7684\u8d44\u6599, \u63cf\u53d9 Asio \u7684\u5f02\u6b65\u6a21\u578b</p>\n<p><a href=\"https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2444r0.pdf\" rel=\"nofollow\">https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2444r0.pdf</a></p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/datadump", 
        "name": "datadump", 
        "avatar": "https://cdn.v2ex.com/avatar/373a/9420/284506_large.png?m=1724288412"
      }, 
      "url": "https://www.v2ex.com/t/1093733", 
      "title": "\u6c42\u6559\uff0c mac \u4e0b cmake c++\u5de5\u7a0b\u7f16\u8bd1\u540e elf \u91cc\u9762\u8fd8\u6709\u5f88\u591a\u8def\u5f84\u5b57\u7b26\u4e32", 
      "id": "https://www.v2ex.com/t/1093733", 
      "date_published": "2024-11-29T07:13:29+00:00", 
      "content_html": "<p>windows \u4e5f\u6709\u8fd9\u6837\u7684\u95ee\u9898\uff0c\u540e\u6765\u53c2\u8003 visual  studio \u8bbe\u7f6e cpp flags \u540e\u89e3\u51b3\u4e86\u3002\n\u4f46\u662f mac \u627e\u4e86\u4e00\u5806\u53c2\u6570\u8fd8\u662f\u4e0d\u884c\u3002</p>\n<p>\u6d4b\u8bd5\u4ee3\u7801\uff1a\n<a href=\"https://github.com/PacktPublishing/Modern-CMake-for-Cpp/blob/main/examples/chapter06/05-dynamic/CMakeLists.txt\" rel=\"nofollow\">https://github.com/PacktPublishing/Modern-CMake-for-Cpp/blob/main/examples/chapter06/05-dynamic/CMakeLists.txt</a>\n\u7f16\u8bd1\uff1a</p>\n<pre><code>cmake . -G \"Unix Makefiles\"\ncmake --build . --config Release\n</code></pre>\n<p>\u751f\u6210\u7684\u6587\u4ef6\u5bfc\u51fa\u7684 string \u6709\u672c\u5730\u6587\u4ef6\u5939\u8def\u5f84\u5b57\u7b26\u4e32\uff08\u4f46\u5b9e\u9645\u9879\u76ee\u91cc\u9762\u5e76\u6ca1\u6709\u7528\u5230__path__\uff09</p>\n<p>\u4e0b\u56fe\u662f\u7528 cutter \uff08\u5f00\u6e90\u53cd\u7f16\u8bd1\u5de5\u5177 <a href=\"https://github.com/rizinorg/cutter\" rel=\"nofollow\">https://github.com/rizinorg/cutter</a> \uff0c\u7c7b\u4f3c IDA pro \uff09\n<img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://i.imgur.com/ck11qwE.png\"/></p>\n<p>\u6dfb\u52a0\u4e86\u4e00\u4e9b\u53c2\u6570\uff08-flto \uff0c-g0 \u8fd8\u662f\u4e0d\u884c\uff09\uff0c\u6c42\u5927\u4f6c\u6307\u70b9\u8ff7\u6d25</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/zzzyk", 
        "name": "zzzyk", 
        "avatar": "https://cdn.v2ex.com/avatar/3215/52bd/622324_large.png?m=1749085791"
      }, 
      "url": "https://www.v2ex.com/t/1093126", 
      "date_modified": "2024-11-27T13:58:44+00:00", 
      "content_html": "<p>\u53ea\u4f1a C \u8bed\u8a00\u60f3\u8fdb\u9636\u5b66\u5b66 C++\uff0c\u8981\u600e\u4e48\u5b66\uff0c\u90a3\u4e9b\u7b80\u5355\u7684\u8bed\u6cd5\u770b\u4e86\u597d\u50cf\u95ee\u9898\u90fd\u4e0d\u5927\uff08\u8ddf C \u57fa\u672c\u4e00\u6837\uff09\uff0c\u4f46\u662f\u5230\u4e86\u90a3\u4e9b\u9762\u5411\u5bf9\u8c61\u7684\u90a3\u4e9b\uff0c\u5c31\u5b8c\u5168\u61f5\u903c\u4e86\uff0c\u770b\u4e0d\u592a\u61c2\u3002\u6709\u4ec0\u4e48\u597d\u7684\u6559\u7a0b\u6216\u8005\u6570\u636e\u63a8\u8350\u5417\u3002</p>\n", 
      "date_published": "2024-11-27T08:07:45+00:00", 
      "title": "C \u600e\u4e48\u8fdb\u9636\u5b66 C++\u5440", 
      "id": "https://www.v2ex.com/t/1093126"
    }
  ]
}