{"id":107247,"date":"2026-09-19T07:49:11","date_gmt":"2026-09-18T23:49:11","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/107247.html"},"modified":"2026-09-19T07:49:11","modified_gmt":"2026-09-18T23:49:11","slug":"%e3%80%90c%e5%be%ae%e6%9c%8d%e5%8a%a1%e9%a1%b9%e7%9b%ae%e5%bc%80%e5%8f%91%e8%84%9a%e6%89%8b%e6%9e%b6%e3%80%91%ef%bc%88%e6%8e%a5%e5%8f%a3%e7%af%87%e4%b8%80%ef%bc%89gflags-gtest-spdlog-%e6%8e%a5","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/107247.html","title":{"rendered":"\u3010C++\u5fae\u670d\u52a1\u9879\u76ee\u5f00\u53d1\u811a\u624b\u67b6\u3011\uff08\u63a5\u53e3\u7bc7\u4e00\uff09gflags + gtest + spdlog \u63a5\u53e3\u5b66\u4e60\u7b14\u8bb0"},"content":{"rendered":"<p id=\"gflags-+-gtest-+-spdlog-\u63a5\u53e3\u5b66\u4e60\u7b14\u8bb0\">\u4e09\u5957 C&#043;&#043; \u5fae\u670d\u52a1\u5e38\u7528\u5e93&#xff0c;\u9010\u4e2a\u63a5\u53e3\u62c6\u7ed9\u4f60\u770b\u3002\u6bcf\u4e2a\u63a5\u53e3\u7edf\u4e00\u683c\u5f0f&#xff1a;\u51fd\u6570\u7b7e\u540d \u2192 \u53c2\u6570\u8868 \u2192 \u4ee3\u7801\u7247\u6bb5 \u2192 \u8fd0\u884c\u7ed3\u679c\u3002 \u6240\u6709\u4ee3\u7801\u6765\u81ea \/home\/dev\/workspace\/ \u771f\u5b9e\u5de5\u7a0b&#xff0c;\u6240\u6709\u8fd0\u884c\u7ed3\u679c\u662f\u5b9e\u9645\u8dd1\u51fa\u6765\u7684\u3002<\/p>\n<hr \/>\n<h2 id=\"\u7b2c\u4e00\u90e8\u5206\uff1agflags\uff08\u547d\u4ee4\u884c\u53c2\u6570\u89e3\u6790\uff09\">\u7b2c\u4e00\u90e8\u5206&#xff1a;gflags&#xff08;\u547d\u4ee4\u884c\u53c2\u6570\u89e3\u6790&#xff09;<\/h2>\n<h3 id=\"1.1-define_bool-\/-define_int32-\/-define_string-\/-define_double-\u2014-\u5b9a\u4e49\u547d\u4ee4\u884c\u53c2\u6570\">1.1 DEFINE_bool \/ DEFINE_int32 \/ DEFINE_string \/ DEFINE_double \u2014 \u5b9a\u4e49\u547d\u4ee4\u884c\u53c2\u6570<\/h3>\n<p>\u51fd\u6570\u7b7e\u540d<\/p>\n<p>DEFINE_bool(\u53c2\u6570\u540d, \u9ed8\u8ba4\u503c, \u5e2e\u52a9\u63cf\u8ff0);<br \/>\nDEFINE_int32(\u53c2\u6570\u540d, \u9ed8\u8ba4\u503c, \u5e2e\u52a9\u63cf\u8ff0);<br \/>\nDEFINE_string(\u53c2\u6570\u540d, \u9ed8\u8ba4\u503c, \u5e2e\u52a9\u63cf\u8ff0);<br \/>\nDEFINE_double(\u53c2\u6570\u540d, \u9ed8\u8ba4\u503c, \u5e2e\u52a9\u63cf\u8ff0); <\/p>\n<p>\u53c2\u6570\u8868<\/p>\n<table>\n<tbody>\n<tr>\n<p>\u53c2\u6570<\/p>\n<p>\u7c7b\u578b<\/p>\n<p>\u542b\u4e49<\/p>\n<\/tr>\n<tr>\n<td>\n<p>\u53c2\u6570\u540d<\/p>\n<\/td>\n<td>\n<p>\u6807\u8bc6\u7b26<\/p>\n<\/td>\n<td>\n<p>\u540e\u9762\u7528 FLAGS_xxx \u8bbf\u95ee<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>\u9ed8\u8ba4\u503c<\/p>\n<\/td>\n<td>\n<p>\u5bf9\u5e94\u7c7b\u578b<\/p>\n<\/td>\n<td>\n<p>\u7528\u6237\u4e0d\u4f20\u547d\u4ee4\u884c\u65f6\u7528\u8fd9\u4e2a\u503c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>\u5e2e\u52a9\u63cf\u8ff0<\/p>\n<\/td>\n<td>\n<p>\u5b57\u7b26\u4e32<\/p>\n<\/td>\n<td>\n<p>-help \u65f6\u663e\u793a<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4ee3\u7801\u7247\u6bb5&#xff08;gflags\/main.cc:14-17&#xff09;<\/p>\n<p>DEFINE_bool(reuse_addr, true,    &#034;\u4f7f\u7528\u542f\u7528\u5730\u5740\u91cd\u7528\u9009\u9879&#034;);<br \/>\nDEFINE_int32(listen_port, 8080,  &#034;\u670d\u52a1\u5668\u76d1\u542c\u7a97\u53e3&#034;);<br \/>\nDEFINE_string(listen_ip, &#034;0.0.0.0&#034;, &#034;\u670d\u52a1\u5668\u76d1\u542cip&#034;);<br \/>\nDEFINE_double(PI, 3.14,          &#034;\u5706\u5468\u7387&#034;); <\/p>\n<p>\u8fd0\u884c\u7ed3\u679c<\/p>\n<p># \u9ed8\u8ba4\u503c\u8fd0\u884c<br \/>\n.\/main<br \/>\n1       \u2190 bool true \u8f93\u51fa 1<br \/>\n8080    \u2190 int32 \u9ed8\u8ba4\u503c<br \/>\n0.0.0.0 \u2190 string \u9ed8\u8ba4\u503c<br \/>\n3.14    \u2190 double \u9ed8\u8ba4\u503c<\/p>\n<p># \u547d\u4ee4\u884c\u8986\u76d6<br \/>\n.\/main -listen_port&#061;9090 -reuse_addr&#061;false<br \/>\n0       \u2190 false<br \/>\n9090    \u2190 \u8986\u76d6<br \/>\n0.0.0.0<br \/>\n3.14 <\/p>\n<hr \/>\n<h3 id=\"1.2-declare_string-\/-declare_int32-\/-declare_bool-\u2014-\u8de8\u6587\u4ef6\u58f0\u660e\u53c2\u6570\">1.2 DECLARE_string \/ DECLARE_int32 \/ DECLARE_bool \u2014 \u8de8\u6587\u4ef6\u58f0\u660e\u53c2\u6570<\/h3>\n<p>\u51fd\u6570\u7b7e\u540d<\/p>\n<p>DECLARE_string(\u53c2\u6570\u540d);   \/\/ \u5728 A.cc \u5b9a\u4e49\u7684 string \u53c2\u6570&#xff0c;B.cc \u8981\u8bbf\u95ee\u5c31\u7528 DECLARE<br \/>\nDECLARE_int32(\u53c2\u6570\u540d);<br \/>\nDECLARE_bool(\u53c2\u6570\u540d);<br \/>\nDECLARE_double(\u53c2\u6570\u540d); <\/p>\n<p>\u4f5c\u7528&#xff1a;DEFINE \u53ea\u80fd\u51fa\u73b0\u4e00\u6b21&#xff08;\u54ea\u4e2a\u6587\u4ef6\u5b9a\u4e49\u90fd\u884c&#xff09;&#xff0c;\u5176\u4ed6\u6587\u4ef6\u8981\u8bbf\u95ee\u540c\u4e00\u4e2a FLAGS_xxx&#xff0c;\u5c31\u5148\u7528 DECLARE \u58f0\u660e\u3002<\/p>\n<p>\u4ee3\u7801\u7247\u6bb5&#xff08;gflags\/child.cc:4&#xff09;<\/p>\n<p>\/\/ child.cc \u91cc\u8981\u8bbf\u95ee main.cc \u5b9a\u4e49\u7684 listen_ip<br \/>\nDECLARE_string(listen_ip);<\/p>\n<p>void Print() {<br \/>\n    std::cout &lt;&lt; FLAGS_listen_ip &lt;&lt; std::endl;   \/\/ \u8de8\u6587\u4ef6\u8bbf\u95ee<br \/>\n} <\/p>\n<p>\u8fd0\u884c\u7ed3\u679c<img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"324\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234904-6aadcdf007bc9.png\" width=\"866\" \/><\/p>\n<hr \/>\n<h3 id=\"1.3-google::parsecommandlineflags-\u2014-\u89e3\u6790\u547d\u4ee4\u884c\">1.3 google::ParseCommandLineFlags \u2014 \u89e3\u6790\u547d\u4ee4\u884c<\/h3>\n<p>\u51fd\u6570\u7b7e\u540d<\/p>\n<p>bool ParseCommandLineFlags(int* argc, char*** argv, bool remove_flags); <\/p>\n<p>\u53c2\u6570\u8868<\/p>\n<table>\n<tbody>\n<tr>\n<p>\u53c2\u6570<\/p>\n<p>\u7c7b\u578b<\/p>\n<p>\u542b\u4e49<\/p>\n<\/tr>\n<tr>\n<td>\n<p>argc<\/p>\n<\/td>\n<td>\n<p>int*<\/p>\n<\/td>\n<td>\n<p>\u6307\u9488&#xff0c;\u4f1a\u88ab\u6539\u5199<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>argv<\/p>\n<\/td>\n<td>\n<p>char***<\/p>\n<\/td>\n<td>\n<p>\u6307\u9488&#xff0c;\u4f1a\u88ab\u6539\u5199<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>remove_flags<\/p>\n<\/td>\n<td>\n<p>bool<\/p>\n<\/td>\n<td>\n<p>true&#061;\u89e3\u6790\u5b8c\u540e\u628a flag \u4ece argv \u91cc\u5220\u6389<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd4\u56de\u503c&#xff1a;\u6210\u529f\u8fd4\u56de true\u3002<\/p>\n<p>\u4ee3\u7801\u7247\u6bb5&#xff08;gflags\/main.cc:23&#xff09;<\/p>\n<p>int main(int argc, char* argv[]) {<br \/>\n    google::ParseCommandLineFlags(&amp;argc, &amp;argv, true);<br \/>\n    \/\/ \u4e4b\u540e\u5c31\u80fd\u7528 FLAGS_xxx \u8bbf\u95ee\u53c2\u6570\u4e86<br \/>\n} <\/p>\n<p>\u8fd0\u884c\u7ed3\u679c<\/p>\n<p>.\/main -listen_port&#061;9090    # \u547d\u4ee4\u884c\u53c2\u6570\u88ab\u89e3\u6790<br \/>\n.\/main &#8211;flagfile&#061;main.conf # \u4e5f\u652f\u6301\u4ece\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6&#xff08;\u89c1\u4e0b&#xff09; <\/p>\n<hr \/>\n<h3 id=\"1.4---flagfile=-\u2014-\u4ece\u914d\u7f6e\u6587\u4ef6\u8bfb\u53c2\u6570\">1.4 &#8211;flagfile&#061; \u2014 \u4ece\u914d\u7f6e\u6587\u4ef6\u8bfb\u53c2\u6570<\/h3>\n<p>\u4ee3\u7801\u7247\u6bb5&#xff08;gflags\/main.conf&#xff09;<\/p>\n<p>&#8211;listen_ip&#061;0.0.0.0<br \/>\n&#8211;reuse_addr&#061;false<br \/>\n&#8211;listen_port&#061;9090<br \/>\n&#8211;PI&#061;3.1415926 <\/p>\n<p>\u8fd0\u884c\u7ed3\u679c<\/p>\n<p>.\/main &#8211;flagfile&#061;main.conf<br \/>\n0           \u2190 \u6765\u81ea conf<br \/>\n9090        \u2190 \u6765\u81ea conf<br \/>\n0.0.0.0     \u2190 \u6765\u81ea conf<br \/>\n3.14159     \u2190 \u6765\u81ea conf&#xff08;double \u622a\u65ad\u663e\u793a&#xff09;<br \/>\n0.0.0.0     \u2190 child.cc Print() <\/p>\n<hr \/>\n<h3 id=\"1.5-gflags-\u5c0f\u7ed3\uff1a\u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\">1.5 gflags \u5c0f\u7ed3&#xff1a;\u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7<\/h3>\n<p>\u914d\u7f6e\u6587\u4ef6 &#8211;flagfile  &lt;  \u547d\u4ee4\u884c\u76f4\u63a5\u4f20\u53c2 <\/p>\n<p>\u5373&#xff1a;\u914d\u7f6e\u6587\u4ef6\u91cc\u5199\u7684\u53ef\u4ee5\u88ab\u547d\u4ee4\u884c\u8986\u76d6\u3002<\/p>\n<p>gflags \u5de5\u7a0b\u6587\u4ef6\u4e00\u89c8<\/p>\n<table>\n<tbody>\n<tr>\n<p>\u6587\u4ef6<\/p>\n<p>\u4f5c\u7528<\/p>\n<\/tr>\n<tr>\n<td>\n<p>main.cc<\/p>\n<\/td>\n<td>\n<p>DEFINE &#043; Parse &#043; \u76f4\u63a5\u8bbf\u95ee FLAGS<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>child.h<\/p>\n<\/td>\n<td>\n<p>\u58f0\u660e extern void Print()<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>child.cc<\/p>\n<\/td>\n<td>\n<p>DECLARE &#043; \u8de8\u6587\u4ef6\u8bbf\u95ee FLAGS<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>main.conf<\/p>\n<\/td>\n<td>\n<p>\u914d\u7f6e\u6587\u4ef6<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>Makefile<\/p>\n<\/td>\n<td>\n<p>g&#043;&#043; main.cc child.cc -o main -lgflags<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"\u7b2c\u4e8c\u90e8\u5206\uff1agtest\uff08\u5355\u5143\u6d4b\u8bd5\u6846\u67b6\uff09\">\u7b2c\u4e8c\u90e8\u5206&#xff1a;gtest&#xff08;\u5355\u5143\u6d4b\u8bd5\u6846\u67b6&#xff09;<\/h2>\n<h3 id=\"2.1-testing::initgoogletest-\u2014-\u521d\u59cb\u5316\u6d4b\u8bd5\u6846\u67b6\">2.1 testing::InitGoogleTest \u2014 \u521d\u59cb\u5316\u6d4b\u8bd5\u6846\u67b6<\/h3>\n<p>\u51fd\u6570\u7b7e\u540d<\/p>\n<p>void InitGoogleTest(int* argc, char** argv); <\/p>\n<p>\u4f5c\u7528&#xff1a;\u89e3\u6790 gtest \u81ea\u5df1\u7684\u547d\u4ee4\u884c\u53c2\u6570&#xff08;\u6bd4\u5982 &#8211;gtest_filter&#xff09;&#xff0c;\u5fc5\u987b\u5728 RUN_ALL_TESTS() \u4e4b\u524d\u8c03\u7528\u3002<\/p>\n<p>\u4ee3\u7801\u7247\u6bb5&#xff08;\u6240\u6709 gtest \u5de5\u7a0b main \u90fd\u4e00\u6837&#xff09;<\/p>\n<p>int main(int argc, char* argv[]) {<br \/>\n    testing::InitGoogleTest(&amp;argc, argv);<br \/>\n    \/\/ &#8230; AddGlobalTestEnvironment \u7b49 &#8230;<br \/>\n    return RUN_ALL_TESTS();<br \/>\n} <\/p>\n<hr \/>\n<h3 id=\"2.2-run_all_tests()-\u2014-\u6267\u884c\u6240\u6709\u6d4b\u8bd5\u7528\u4f8b\">2.2 RUN_ALL_TESTS() \u2014 \u6267\u884c\u6240\u6709\u6d4b\u8bd5\u7528\u4f8b<\/h3>\n<p>\u4f5c\u7528&#xff1a;\u626b\u63cf\u6240\u6709 TEST \/ TEST_F \u5b8f\u6ce8\u518c\u7684\u7528\u4f8b&#xff0c;\u9010\u4e2a\u6267\u884c\u5e76\u8f93\u51fa\u7ed3\u679c\u3002<\/p>\n<p>\u4ee3\u7801\u7247\u6bb5<\/p>\n<p>return RUN_ALL_TESTS();   \/\/ main \u91cc\u7684 return \u503c <\/p>\n<hr \/>\n<h3 id=\"2.3-test(\u6d4b\u8bd5\u5957\u4ef6,-\u7528\u4f8b\u540d)-\u2014-\u5b9a\u4e49\u666e\u901a\u6d4b\u8bd5\u7528\u4f8b\">2.3 TEST(\u6d4b\u8bd5\u5957\u4ef6, \u7528\u4f8b\u540d) \u2014 \u5b9a\u4e49\u666e\u901a\u6d4b\u8bd5\u7528\u4f8b<\/h3>\n<p>\u5b8f\u5c55\u5f00<\/p>\n<p>#define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name) <\/p>\n<p>\u53c2\u6570\u8868<\/p>\n<table>\n<tbody>\n<tr>\n<p>\u53c2\u6570<\/p>\n<p>\u542b\u4e49<\/p>\n<\/tr>\n<tr>\n<td>\n<p>test_suite_name<\/p>\n<\/td>\n<td>\n<p>\u6d4b\u8bd5\u5957\u4ef6\u540d&#xff08;\u5206\u7ec4&#xff09;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>test_name<\/p>\n<\/td>\n<td>\n<p>\u7528\u4f8b\u540d<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4ee3\u7801\u7247\u6bb5&#xff08;gtest\/simple.cc:13-35&#xff09;<\/p>\n<p>TEST(unordered_map_set, insert) {<br \/>\n    std::unordered_map&lt;int, int&gt; map;<br \/>\n    map.insert(std::make_pair(1, 1));<br \/>\n    map.insert(std::make_pair(2, 2));<br \/>\n    map.insert(std::make_pair(3, 3));<br \/>\n    ASSERT_EQ(map.size(), 3);<br \/>\n}<\/p>\n<p>TEST(unordered_map_test, insert) {<br \/>\n    std::unordered_map&lt;int, int&gt; map;<br \/>\n    map.insert(std::make_pair(1, 1));<br \/>\n    map.insert(std::make_pair(2, 2));<br \/>\n    map.insert(std::make_pair(3, 3));<br \/>\n    ASSERT_EQ(map.size(), 3);<br \/>\n}<\/p>\n<p>TEST(unordered_map_test, find) {<br \/>\n    std::unordered_map&lt;int, int&gt; map;<br \/>\n    map.insert(std::make_pair(1, 1));<br \/>\n    map.insert(std::make_pair(2, 2));<br \/>\n    ASSERT_NE(map.find(1), map.end());<br \/>\n    ASSERT_EQ(map.find(1)-&gt;second, 1);<br \/>\n} <\/p>\n<p>\u8fd0\u884c\u7ed3\u679c<img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"463\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234904-6aadcdf08b414.png\" width=\"782\" \/><\/p>\n<hr \/>\n<h3 id=\"2.4-assert_eq-\/-assert_ne-\/-assert_true-\/-assert_false-\u2014-\u65ad\u8a00\u5b8f\">2.4 ASSERT_EQ \/ ASSERT_NE \/ ASSERT_TRUE \/ ASSERT_FALSE \u2014 \u65ad\u8a00\u5b8f<\/h3>\n<p>\u4f5c\u7528&#xff1a;\u68c0\u67e5\u6761\u4ef6\u662f\u5426\u6210\u7acb\u3002ASSERT_* \u662f fatal \u65ad\u8a00&#xff0c;\u5931\u8d25\u4e86\u5f53\u524d\u7528\u4f8b\u76f4\u63a5\u7ec8\u6b62&#xff1b;EXPECT_* \u662f non-fatal&#xff0c;\u5931\u8d25\u4e86\u7ee7\u7eed\u5f80\u4e0b\u8d70\u3002<\/p>\n<p>\u5b8c\u6574\u5bf9\u7167\u8868<\/p>\n<table>\n<tr>\u65ad\u8a00\u542b\u4e49\u793a\u4f8b<\/tr>\n<tbody>\n<tr>\n<td>ASSERT_EQ(a, b)<\/td>\n<td>a &#061;&#061; b<\/td>\n<td>ASSERT_EQ(map.size(), 3);<\/td>\n<\/tr>\n<tr>\n<td>ASSERT_NE(a, b)<\/td>\n<td>a !&#061; b<\/td>\n<td>ASSERT_NE(map.find(1), map.end());<\/td>\n<\/tr>\n<tr>\n<td>ASSERT_LT(a, b)<\/td>\n<td>a &lt; b<\/td>\n<td>ASSERT_LT(1, 2);<\/td>\n<\/tr>\n<tr>\n<td>ASSERT_LE(a, b)<\/td>\n<td>a &lt;&#061; b<\/td>\n<td>ASSERT_LE(map.size(), 10);<\/td>\n<\/tr>\n<tr>\n<td>ASSERT_GT(a, b)<\/td>\n<td>a &gt; b<\/td>\n<td>ASSERT_GT(2, 1);<\/td>\n<\/tr>\n<tr>\n<td>ASSERT_GE(a, b)<\/td>\n<td>a &gt;&#061; b<\/td>\n<td>ASSERT_GE(map.size(), 3);<\/td>\n<\/tr>\n<tr>\n<td>ASSERT_TRUE(x)<\/td>\n<td>x &#061;&#061; true<\/td>\n<td>ASSERT_TRUE(map.empty());<\/td>\n<\/tr>\n<tr>\n<td>ASSERT_FALSE(x)<\/td>\n<td>x &#061;&#061; false<\/td>\n<td>ASSERT_FALSE(flag);<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u56db\u4e2a\u7c7b\u522b\u7684\u52a9\u8bb0<\/p>\n<table>\n<tr>\u524d\u7f00\u542b\u4e49\u5bf9\u5e94\u82f1\u6587<\/tr>\n<tbody>\n<tr>\n<td>EQ<\/td>\n<td>\u7b49\u4e8e<\/td>\n<td>Equal<\/td>\n<\/tr>\n<tr>\n<td>NE<\/td>\n<td>\u4e0d\u7b49\u4e8e<\/td>\n<td>Not Equal<\/td>\n<\/tr>\n<tr>\n<td>LT<\/td>\n<td>\u5c0f\u4e8e<\/td>\n<td>Less Than<\/td>\n<\/tr>\n<tr>\n<td>LE<\/td>\n<td>\u5c0f\u4e8e\u7b49\u4e8e<\/td>\n<td>Less or Equal<\/td>\n<\/tr>\n<tr>\n<td>GT<\/td>\n<td>\u5927\u4e8e<\/td>\n<td>Greater Than<\/td>\n<\/tr>\n<tr>\n<td>GE<\/td>\n<td>\u5927\u4e8e\u7b49\u4e8e<\/td>\n<td>Greater or Equal<\/td>\n<\/tr>\n<tr>\n<td>TRUE \/ FALSE<\/td>\n<td>\u5e03\u5c14\u5224\u65ad<\/td>\n<td>\u2014<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4ee3\u7801\u7247\u6bb5<\/p>\n<p>ASSERT_EQ(map.size(), 3);<br \/>\nASSERT_NE(map.find(1), map.end());<br \/>\nASSERT_EQ(map.find(1)-&gt;second, 1); <\/p>\n<hr \/>\n<h3 id=\"2.5-testing::test-+-test_f-\u2014-\u5c40\u90e8\u6d4b\u8bd5\u5957\u4ef6\uff08fixture\uff09\">2.5 testing::Test &#043; TEST_F \u2014 \u5c40\u90e8\u6d4b\u8bd5\u5957\u4ef6&#xff08;Fixture&#xff09;<\/h3>\n<p>\u662f\u4ec0\u4e48&#xff1f; \u5f53\u591a\u4e2a\u7528\u4f8b\u5171\u4eab\u76f8\u540c\u7684\u521d\u59cb\u5316\/\u6e05\u7406\u903b\u8f91\u65f6&#xff0c;\u7ee7\u627f testing::Test \u5b9a\u4e49\u4e00\u4e2a Fixture \u7c7b&#xff0c;\u7528 TEST_F \u4ee3\u66ff TEST\u3002<\/p>\n<p>Fixture \u751f\u547d\u5468\u671f<\/p>\n<p>SetUpTestCase()        \u2190 \u6240\u6709\u7528\u4f8b\u4e4b\u524d\u6267\u884c\u4e00\u6b21&#xff08;\u7c7b\u7ea7&#xff09;<br \/>\n\u251c\u2500\u2500 SetUp()            \u2190 \u6bcf\u4e2a\u7528\u4f8b\u4e4b\u524d\u6267\u884c<br \/>\n\u2502   \u251c\u2500\u2500 \u6d4b\u8bd5\u7528\u4f8b\u4f53<br \/>\n\u2502   \u2514\u2500\u2500 TearDown()     \u2190 \u6bcf\u4e2a\u7528\u4f8b\u4e4b\u540e\u6267\u884c<br \/>\n\u251c\u2500\u2500 SetUp()<br \/>\n\u2502   \u251c\u2500\u2500 \u6d4b\u8bd5\u7528\u4f8b\u4f53<br \/>\n\u2502   \u2514\u2500\u2500 TearDown()<br \/>\nTearDownTestCase()     \u2190 \u6240\u6709\u7528\u4f8b\u4e4b\u540e\u6267\u884c\u4e00\u6b21&#xff08;\u7c7b\u7ea7&#xff09; <\/p>\n<p>\u4ee3\u7801\u7247\u6bb5&#xff08;gtest\/local.cc:14-48&#xff09;<\/p>\n<p>class LocalTestSuite : public testing::Test {<br \/>\npublic:<br \/>\n    static void SetUpTestCase() {<br \/>\n        std::cout &lt;&lt; &#034;\u516c\u5171\u73af\u5883\u521d\u59cb\u63a5\u53e3&#8211;\u4f1a\u5728\u6240\u6709\u6d4b\u8bd5\u7528\u4f8b\u4e4b\u524d\u6267\u884c\\\\n&#034;;<br \/>\n    }<br \/>\n    static void TearDownTestCase() {<br \/>\n        std::cout &lt;&lt; &#034;\u516c\u5171\u73af\u5883\u6e05\u7406\u63a5\u53e3&#8211;\u4f1a\u5728\u6240\u6709\u6d4b\u8bd5\u7528\u4f8b\u4e4b\u540e\u6267\u884c\\\\n&#034;;<br \/>\n    }<br \/>\n    virtual void SetUp() {<br \/>\n        std::cout &lt;&lt; &#034;\u6267\u884c\u4e8e\u6bcf\u4e2a\u7528\u4f8b\u4e4b\u524d&#034; &lt;&lt; std::endl;<br \/>\n        map.insert(std::make_pair(1, 1));<br \/>\n        map.insert(std::make_pair(2, 2));<br \/>\n        map.insert(std::make_pair(3, 3));<br \/>\n    }<br \/>\n    virtual void TearDown() {<br \/>\n        std::cout &lt;&lt; &#034;\u6267\u884c\u4e8e\u6bcf\u4e2a\u7528\u4f8b\u4e4b\u540e&#034; &lt;&lt; std::endl;<br \/>\n        map.clear();<br \/>\n    }<br \/>\npublic:<br \/>\n    std::unordered_map&lt;int, int&gt; map;<br \/>\n};<\/p>\n<p>TEST_F(LocalTestSuite, find) {<br \/>\n    ASSERT_EQ(map.size(), 3);<br \/>\n    ASSERT_EQ(map.find(1)-&gt;second, 1);<br \/>\n    map.erase(1);<br \/>\n    std::cout &lt;&lt; &#034;\u6d4b\u8bd5\u7528\u4f8b1&#034; &lt;&lt; std::endl;<br \/>\n} <\/p>\n<p>\u8fd0\u884c\u7ed3\u679c<img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"396\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234904-6aadcdf0b9730.png\" width=\"665\" \/><\/p>\n<hr \/>\n<h3 id=\"2.6-testing::environment-+-addglobaltestenvironment-\u2014-\u5168\u5c40\u6d4b\u8bd5\u73af\u5883\">2.6 testing::Environment &#043; AddGlobalTestEnvironment \u2014 \u5168\u5c40\u6d4b\u8bd5\u73af\u5883<\/h3>\n<p>\u662f\u4ec0\u4e48&#xff1f; \u548c Fixture \u7684\u533a\u522b&#xff1a;Fixture \u7ba1\u4e00\u4e2a\u6d4b\u8bd5\u5957\u4ef6\u7684\u751f\u547d\u5468\u671f&#xff0c;Environment \u7ba1\u6574\u4e2a\u6d4b\u8bd5\u7a0b\u5e8f\u7684\u751f\u547d\u5468\u671f\u3002\u6240\u6709\u5957\u4ef6\u5171\u4eab\u3002<\/p>\n<p>Environment \u751f\u547d\u5468\u671f<\/p>\n<p>Environment::SetUp()      \u2190 \u6240\u6709\u6d4b\u8bd5\u5957\u4ef6\u3001\u6240\u6709\u7528\u4f8b\u4e4b\u524d\u6267\u884c\u4e00\u6b21<br \/>\n\u251c\u2500\u2500 \u5957\u4ef61 SetUpTestCase \u2192 SetUp \u2192 \u7528\u4f8b1 \u2192 TearDown \u2192 TearDownTestCase<br \/>\n\u251c\u2500\u2500 \u5957\u4ef62 SetUpTestCase \u2192 SetUp \u2192 \u7528\u4f8b2 \u2192 TearDown \u2192 TearDownTestCase<br \/>\nEnvironment::TearDown()   \u2190 \u6240\u6709\u6d4b\u8bd5\u5957\u4ef6\u3001\u6240\u6709\u7528\u4f8b\u4e4b\u540e\u6267\u884c\u4e00\u6b21 <\/p>\n<p>\u4ee3\u7801\u7247\u6bb5&#xff08;gtest\/global.cc:22-50&#xff09;<\/p>\n<p>\/\/ \u5168\u5c40\u53d8\u91cf&#xff0c;\u6240\u6709\u6d4b\u8bd5\u5171\u7528<br \/>\nstd::unordered_map&lt;int, int&gt; g_map;<\/p>\n<p>class GlobalTestEnvironment : public testing::Environment {<br \/>\npublic:<br \/>\n    virtual void SetUp() override {<br \/>\n        std::cout &lt;&lt; &#034;\u6267\u884c\u4e8e\u6240\u6709\u4f8b\u5b50\u4e4b\u524d&#034; &lt;&lt; std::endl;<br \/>\n        g_map.insert(std::make_pair(1, 1));<br \/>\n        g_map.insert(std::make_pair(2, 2));<br \/>\n        g_map.insert(std::make_pair(3, 3));<br \/>\n    }<br \/>\n    virtual void TearDown() override {<br \/>\n        std::cout &lt;&lt; &#034;\u6267\u884c\u4e8e\u6240\u6709\u7528\u4f8b\u4e4b\u540e&#034; &lt;&lt; std::endl;<br \/>\n        g_map.clear();<br \/>\n    }<br \/>\n};<\/p>\n<p>TEST(GlobalMapTest, Insert) {<br \/>\n    ASSERT_EQ(g_map.size(), 3);<br \/>\n}<\/p>\n<p>TEST(GlobalMapTest, Find) {<br \/>\n    ASSERT_NE(g_map.find(1), g_map.end());<br \/>\n    ASSERT_EQ(g_map.find(1)-&gt;second, 1);<br \/>\n}<\/p>\n<p>int main(int argc, char* argv[]) {<br \/>\n    testing::InitGoogleTest(&amp;argc, argv);<br \/>\n    testing::AddGlobalTestEnvironment(new GlobalTestEnvironment);<br \/>\n    return RUN_ALL_TESTS();<br \/>\n} <\/p>\n<p>\u8fd0\u884c\u7ed3\u679c<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"394\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234904-6aadcdf0d8032.png\" width=\"641\" \/><\/p>\n<hr \/>\n<h3 id=\"2.7-gtest-\u4e09\u79cd\u6d4b\u8bd5\u65b9\u5f0f\u5bf9\u6bd4\">2.7 gtest \u4e09\u79cd\u6d4b\u8bd5\u65b9\u5f0f\u5bf9\u6bd4<\/h3>\n<table>\n<tbody>\n<tr>\n<p>\u65b9\u5f0f<\/p>\n<p>\u5b8f\/\u7c7b<\/p>\n<p>\u751f\u547d\u5468\u671f<\/p>\n<p>\u9002\u7528\u573a\u666f<\/p>\n<\/tr>\n<tr>\n<td>\n<p>\u666e\u901a\u6d4b\u8bd5<\/p>\n<\/td>\n<td>\n<p>TEST(Suite, Name)<\/p>\n<\/td>\n<td>\n<p>\u65e0\u5171\u4eab&#xff0c;\u6bcf\u6b21\u72ec\u7acb<\/p>\n<\/td>\n<td>\n<p>\u7b80\u5355\u3001\u65e0\u4f9d\u8d56\u7684\u6d4b\u8bd5<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>\u5c40\u90e8\u5957\u4ef6<\/p>\n<\/td>\n<td>\n<p>TEST_F(Fixture, Name) &#043; \u7ee7\u627f testing::Test<\/p>\n<\/td>\n<td>\n<p>\u6bcf\u4e2a\u5957\u4ef6\u72ec\u7acb\u7684 SetUp\/TearDown<\/p>\n<\/td>\n<td>\n<p>\u540c\u5957\u4ef6\u591a\u4e2a\u7528\u4f8b\u5171\u4eab\u6570\u636e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>\u5168\u5c40\u73af\u5883<\/p>\n<\/td>\n<td>\n<p>AddGlobalTestEnvironment &#043; \u7ee7\u627f testing::Environment<\/p>\n<\/td>\n<td>\n<p>\u6574\u4e2a\u7a0b\u5e8f\u53ea\u6267\u884c\u4e00\u6b21<\/p>\n<\/td>\n<td>\n<p>\u6240\u6709\u5957\u4ef6\u5171\u4eab\u7684\u5168\u5c40\u8d44\u6e90<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>gtest \u5de5\u7a0b\u6587\u4ef6\u4e00\u89c8<\/p>\n<table>\n<tbody>\n<tr>\n<p>\u6587\u4ef6<\/p>\n<p>\u4f5c\u7528<\/p>\n<\/tr>\n<tr>\n<td>\n<p>simple.cc<\/p>\n<\/td>\n<td>\n<p>TEST \u5b8f &#043; ASSERT \u65ad\u8a00<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>local.cc<\/p>\n<\/td>\n<td>\n<p>TEST_F &#043; testing::Test Fixture<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>global.cc<\/p>\n<\/td>\n<td>\n<p>testing::Environment &#043; AddGlobalTestEnvironment<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>Makefile<\/p>\n<\/td>\n<td>\n<p>g&#043;&#043; xxx.cc -o xxx -lgtest<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"\u7b2c\u4e09\u90e8\u5206\uff1aspdlog\uff08\u9ad8\u6027\u80fd\u65e5\u5fd7\u5e93\uff09\">\u7b2c\u4e09\u90e8\u5206&#xff1a;spdlog&#xff08;\u9ad8\u6027\u80fd\u65e5\u5fd7\u5e93&#xff09;<\/h2>\n<h3 id=\"3.1-spdlog::init_thread_pool-\u2014-\u521d\u59cb\u5316\u5f02\u6b65\u7ebf\u7a0b\u6c60\">3.1 spdlog::init_thread_pool \u2014 \u521d\u59cb\u5316\u5f02\u6b65\u7ebf\u7a0b\u6c60<\/h3>\n<p>\u51fd\u6570\u7b7e\u540d<\/p>\n<p>void init_thread_pool(size_t queue_size, size_t n_threads); <\/p>\n<p>\u53c2\u6570\u8868<\/p>\n<table>\n<tbody>\n<tr>\n<p>\u53c2\u6570<\/p>\n<p>\u7c7b\u578b<\/p>\n<p>\u542b\u4e49<\/p>\n<\/tr>\n<tr>\n<td>\n<p>queue_size<\/p>\n<\/td>\n<td>\n<p>size_t<\/p>\n<\/td>\n<td>\n<p>\u65e5\u5fd7\u961f\u5217\u80fd\u7f13\u5b58\u591a\u5c11\u6761&#xff0c;\u9ed8\u8ba4 8192<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>n_threads<\/p>\n<\/td>\n<td>\n<p>size_t<\/p>\n<\/td>\n<td>\n<p>\u540e\u53f0\u6d88\u8d39\u7ebf\u7a0b\u6570&#xff0c;\u9ed8\u8ba4 1<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u00a0\u5f02\u6b65\u6a21\u5f0f\u5fc5\u987b\u5148\u8c03\u7528&#xff0c;\u5426\u5219\u5f02\u6b65\u5de5\u5382\u4f1a\u5d29\u6e83&#xff01;<\/p>\n<p>\u4ee3\u7801\u7247\u6bb5&#xff08;stdout.cc:22&#xff09;<\/p>\n<p>spdlog::init_thread_pool(8192, 1); <\/p>\n<hr \/>\n<h3 id=\"3.2-spdlog::stdout_color_mt&lt;factory&gt;-\u2014-\u5f69\u8272\u63a7\u5236\u53f0-logger-\u5de5\u5382\">3.2 spdlog::stdout_color_mt&lt;Factory&gt; \u2014 \u5f69\u8272\u63a7\u5236\u53f0 logger \u5de5\u5382<\/h3>\n<p>\u51fd\u6570\u7b7e\u540d<\/p>\n<p>\/\/ \u540c\u6b65\u7248\u672c<br \/>\nstd::shared_ptr&lt;logger&gt; stdout_color_mt(const std::string&amp; logger_name, color_mode mode &#061; color_mode::automatic);<\/p>\n<p>\/\/ \u5f02\u6b65\u7248\u672c&#xff08;\u6a21\u677f\u53c2\u6570\u6307\u5b9a\u5de5\u5382&#xff09;<br \/>\ntemplate&lt;typename Factory&gt;<br \/>\nstd::shared_ptr&lt;logger&gt; stdout_color_mt&lt;Factory&gt;(const std::string&amp; logger_name, color_mode mode &#061; color_mode::automatic); <\/p>\n<p>\u53c2\u6570\u8868<\/p>\n<table>\n<tbody>\n<tr>\n<p>\u53c2\u6570<\/p>\n<p>\u7c7b\u578b<\/p>\n<p>\u542b\u4e49<\/p>\n<\/tr>\n<tr>\n<td>\n<p>Factory<\/p>\n<\/td>\n<td>\n<p>\u6a21\u677f\u53c2\u6570<\/p>\n<\/td>\n<td>\n<p>spdlog::async_factory&#061;\u5f02\u6b65&#xff1b;\u4e0d\u4f20&#061;\u540c\u6b65<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>logger_name<\/p>\n<\/td>\n<td>\n<p>string<\/p>\n<\/td>\n<td>\n<p>logger \u540d\u5b57&#xff0c;\u7528\u4e8e drop \/ registry \u67e5\u627e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>mode<\/p>\n<\/td>\n<td>\n<p>color_mode<\/p>\n<\/td>\n<td>\n<p>automatic&#061;tty \u624d\u4e0a\u8272&#xff0c;always&#061;\u5f3a\u5236&#xff0c;never&#061;\u4e0d\u4e0a\u8272<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4ee3\u7801\u7247\u6bb5<\/p>\n<p>\/\/ \u5f02\u6b65<br \/>\nauto logger &#061; spdlog::stdout_color_mt&lt;spdlog::async_factory&gt;(&#034;stdout_logger&#034;);<br \/>\n\/\/ \u540c\u6b65<br \/>\nauto logger2 &#061; spdlog::stdout_color_mt(&#034;stdout_logger&#034;); <\/p>\n<p>\u8fd0\u884c\u7ed3\u679c<\/p>\n<p>[16:42:07][debug  ][test.cc:26]: \u5c0f\u660e\u4eca\u5e7418\u5c81       \u2190 \u7ec8\u7aef\u5f69\u8272\u9ad8\u4eae<br \/>\n[16:42:07][info   ][test.cc:27]: \u5c0f\u7ea2\u4eca\u5e7419\u5c81<br \/>\n[16:42:07][warning][test.cc:28]: \u5c0f\u521a\u4eca\u5e7420\u5c81<br \/>\n[16:42:07][error  ][test.cc:29]: \u5c0f\u674e\u4eca\u5e7421\u5c81 <\/p>\n<hr \/>\n<h3 id=\"3.3-spdlog::basic_logger_mt&lt;factory&gt;-\u2014-\u57fa\u7840\u6587\u4ef6-logger-\u5de5\u5382\">3.3 spdlog::basic_logger_mt&lt;Factory&gt; \u2014 \u57fa\u7840\u6587\u4ef6 logger \u5de5\u5382<\/h3>\n<p>\u51fd\u6570\u7b7e\u540d<\/p>\n<p>\/\/ \u540c\u6b65\u7248\u672c<br \/>\nstd::shared_ptr&lt;logger&gt; basic_logger_mt(const std::string&amp; logger_name, const std::string&amp; filename, bool truncate &#061; false);<\/p>\n<p>\/\/ \u5f02\u6b65\u7248\u672c<br \/>\ntemplate&lt;typename Factory&gt;<br \/>\nstd::shared_ptr&lt;logger&gt; basic_logger_mt&lt;Factory&gt;(const std::string&amp; logger_name, const std::string&amp; filename, bool truncate &#061; false); <\/p>\n<p>\u53c2\u6570\u8868<\/p>\n<table>\n<tbody>\n<tr>\n<p>\u53c2\u6570<\/p>\n<p>\u7c7b\u578b<\/p>\n<p>\u542b\u4e49<\/p>\n<\/tr>\n<tr>\n<td>\n<p>Factory<\/p>\n<\/td>\n<td>\n<p>\u6a21\u677f\u53c2\u6570<\/p>\n<\/td>\n<td>\n<p>spdlog::async_factory&#061;\u5f02\u6b65<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>logger_name<\/p>\n<\/td>\n<td>\n<p>string<\/p>\n<\/td>\n<td>\n<p>logger \u540d\u5b57<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>filename<\/p>\n<\/td>\n<td>\n<p>string<\/p>\n<\/td>\n<td>\n<p>\u65e5\u5fd7\u6587\u4ef6\u8def\u5f84<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>truncate<\/p>\n<\/td>\n<td>\n<p>bool<\/p>\n<\/td>\n<td>\n<p>true&#061;\u6bcf\u6b21\u6e05\u7a7a\u6587\u4ef6&#xff0c;false&#061;\u8ffd\u52a0&#xff08;\u9ed8\u8ba4&#xff09;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4ee3\u7801\u7247\u6bb5<\/p>\n<p>g_logger &#061; spdlog::basic_logger_mt&lt;spdlog::async_factory&gt;(&#034;file_logger&#034;, &#034;.\/app.log&#034;); <\/p>\n<p>\u8fd0\u884c\u7ed3\u679c<\/p>\n<p>.\/app -log_path&#061;.\/test.log -log_level&#061;4<br \/>\ncat test.log<br \/>\n[16:42:07][error  ][test.cc:29]: \u5c0f\u674e\u4eca\u5e7421\u5c81 <\/p>\n<hr \/>\n<h3 id=\"3.4-spdlog::drop-\u2014-\u6309\u540d\u5b57\u6e05\u7406-logger\">3.4 spdlog::drop \u2014 \u6309\u540d\u5b57\u6e05\u7406 logger<\/h3>\n<p>\u51fd\u6570\u7b7e\u540d<\/p>\n<p>void drop(const std::string&amp; logger_name); <\/p>\n<p>\u4f5c\u7528&#xff1a;spdlog registry \u91cc\u4e0d\u5141\u8bb8\u540c\u540d logger\u3002\u91cd\u590d\u8c03\u7528\u521d\u59cb\u5316\u51fd\u6570\u65f6&#xff0c;\u5fc5\u987b\u5148 drop \u65e7\u7684&#xff0c;\u5426\u5219\u629b logger already exists \u5f02\u5e38\u3002<\/p>\n<p>\u4ee3\u7801\u7247\u6bb5&#xff08;log.cc:18-19&#xff09;<\/p>\n<p>spdlog::drop(&#034;stdout_logger&#034;);<br \/>\nspdlog::drop(&#034;file_logger&#034;); <\/p>\n<hr \/>\n<h3 id=\"3.5-logger-&gt;set_level-\u2014-\u8bbe\u7f6e\u65e5\u5fd7\u7b49\u7ea7\">3.5 logger-&gt;set_level \u2014 \u8bbe\u7f6e\u65e5\u5fd7\u7b49\u7ea7<\/h3>\n<p>\u51fd\u6570\u7b7e\u540d<\/p>\n<p>void set_level(level::level_enum log_level); <\/p>\n<p>\u7b49\u7ea7\u5bf9\u7167\u8868<\/p>\n<table>\n<tbody>\n<tr>\n<p>\u679a\u4e3e\u503c<\/p>\n<p>\u6574\u6570<\/p>\n<p>\u542b\u4e49<\/p>\n<\/tr>\n<tr>\n<td>\n<p>level::trace<\/p>\n<\/td>\n<td>\n<p>0<\/p>\n<\/td>\n<td>\n<p>\u6700\u7ec6&#xff0c;\u4ec0\u4e48\u90fd\u6253<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>level::debug<\/p>\n<\/td>\n<td>\n<p>1<\/p>\n<\/td>\n<td>\n<p>\u8c03\u8bd5\u4fe1\u606f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>level::info<\/p>\n<\/td>\n<td>\n<p>2<\/p>\n<\/td>\n<td>\n<p>\u4e00\u822c\u4fe1\u606f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>level::warn<\/p>\n<\/td>\n<td>\n<p>3<\/p>\n<\/td>\n<td>\n<p>\u8b66\u544a<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>level::err<\/p>\n<\/td>\n<td>\n<p>4<\/p>\n<\/td>\n<td>\n<p>\u9519\u8bef<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>level::critical<\/p>\n<\/td>\n<td>\n<p>5<\/p>\n<\/td>\n<td>\n<p>\u81f4\u547d\u9519\u8bef<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>level::off<\/p>\n<\/td>\n<td>\n<p>6<\/p>\n<\/td>\n<td>\n<p>\u5168\u90e8\u5173\u95ed<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4ee3\u7801\u7247\u6bb5<\/p>\n<p>logger-&gt;set_level(spdlog::level::err);                          \/\/ \u76f4\u63a5\u4f20\u679a\u4e3e<br \/>\nlogger-&gt;set_level(spdlog::level::level_enum(settings.level));   \/\/ int \u8f6c\u679a\u4e3e <\/p>\n<p>\u8fd0\u884c\u7ed3\u679c<\/p>\n<p># \u9ed8\u8ba4 level&#061;1&#xff08;debug&#xff09;&#xff0c;\u5168\u90e8\u8f93\u51fa<br \/>\n.\/app<br \/>\n[16:42:07][debug  ][test.cc:26]: \u5c0f\u660e\u4eca\u5e7418\u5c81<br \/>\n[16:42:07][info   ][test.cc:27]: \u5c0f\u7ea2\u4eca\u5e7419\u5c81<br \/>\n[16:42:07][warning][test.cc:28]: \u5c0f\u521a\u4eca\u5e7420\u5c81<br \/>\n[16:42:07][error  ][test.cc:29]: \u5c0f\u674e\u4eca\u5e7421\u5c81<br \/>\n[16:42:07][debug  ][test.cc:30]: HELLO<\/p>\n<p># \u6539\u6210 level&#061;4&#xff08;err&#xff09;&#xff0c;\u53ea\u7559 error<br \/>\n.\/app -log_level&#061;4<br \/>\n[16:42:07][error  ][test.cc:29]: \u5c0f\u674e\u4eca\u5e7421\u5c81 <\/p>\n<hr \/>\n<h3 id=\"3.6-logger-&gt;set_pattern-\u2014-\u8bbe\u7f6e\u8f93\u51fa\u683c\u5f0f\">3.6 logger-&gt;set_pattern \u2014 \u8bbe\u7f6e\u8f93\u51fa\u683c\u5f0f<\/h3>\n<p>\u51fd\u6570\u7b7e\u540d<\/p>\n<p>void set_pattern(const std::string&amp; pattern); <\/p>\n<p>\u5e38\u7528\u5360\u4f4d\u7b26<\/p>\n<table>\n<tbody>\n<tr>\n<p>\u5360\u4f4d\u7b26<\/p>\n<p>\u542b\u4e49<\/p>\n<p>\u793a\u4f8b<\/p>\n<\/tr>\n<tr>\n<td>\n<p>%v<\/p>\n<\/td>\n<td>\n<p>\u7528\u6237\u6d88\u606f<\/p>\n<\/td>\n<td>\n<p>\u5c0f\u660e\u4eca\u5e7418\u5c81<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>%l<\/p>\n<\/td>\n<td>\n<p>level \u5168\u540d<\/p>\n<\/td>\n<td>\n<p>debug<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>%-7l<\/p>\n<\/td>\n<td>\n<p>level \u5de6\u5bf9\u9f50 7 \u5b57\u7b26<\/p>\n<\/td>\n<td>\n<p>debug <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>%H:%M:%S<\/p>\n<\/td>\n<td>\n<p>\u65f6\u5206\u79d2<\/p>\n<\/td>\n<td>\n<p>16:42:07<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>%Y-%m-%d<\/p>\n<\/td>\n<td>\n<p>\u5e74\u6708\u65e5<\/p>\n<\/td>\n<td>\n<p>2026-09-18<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>%n<\/p>\n<\/td>\n<td>\n<p>logger \u540d<\/p>\n<\/td>\n<td>\n<p>stdout_logger<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4ee3\u7801\u7247\u6bb5<\/p>\n<p>logger-&gt;set_pattern(&#034;[%H:%M:%S][%l]: %v&#034;);                      \/\/ stdout.cc \u7528\u7684<br \/>\nlogger-&gt;set_pattern(&#034;[%H:%M:%S][%-7l]: %v&#034;);                    \/\/ \u5c01\u88c5\u9ed8\u8ba4&#xff0c;level \u5bf9\u9f50 <\/p>\n<hr \/>\n<h3 id=\"3.7-logger-&gt;error-\/-info-\/-warn-\/-debug-\u2014-\u8bb0\u5f55\u65e5\u5fd7\">3.7 logger-&gt;error \/ info \/ warn \/ debug \u2014 \u8bb0\u5f55\u65e5\u5fd7<\/h3>\n<p>\u51fd\u6570\u7b7e\u540d<\/p>\n<p>template&lt;typename&#8230; Args&gt;<br \/>\nvoid error(fmt::format_string&lt;Args&#8230;&gt; fmt, Args&amp;&amp;&#8230; args);<br \/>\n\/\/ info \/ warn \/ debug \u7b7e\u540d\u4e00\u6837 <\/p>\n<p>\u4ee3\u7801\u7247\u6bb5<\/p>\n<p>logger-&gt;error(&#034;hello world &#8211; {}&#034;, i);            \/\/ \u4e00\u4e2a\u5360\u4f4d\u7b26<br \/>\nlogger-&gt;info(&#034;{}\u4eca\u5e74{}\u5c81&#034;, &#034;\u5c0f\u660e&#034;, 18);           \/\/ \u4e24\u4e2a\u5360\u4f4d\u7b26<br \/>\nlogger-&gt;debug(&#034;HELLO&#034;);                           \/\/ \u65e0\u5360\u4f4d\u7b26 <\/p>\n<p>\u8fd0\u884c\u7ed3\u679c<\/p>\n<p>.\/stdout | head -5<br \/>\n[16:42:08][error]: hello world &#8211; 0<br \/>\n[16:42:08][error]: hello world &#8211; 1<br \/>\n[16:42:08][error]: hello world &#8211; 2<br \/>\n[16:42:08][error]: hello world &#8211; 3<br \/>\n[16:42:08][error]: hello world &#8211; 4<\/p>\n<p>.\/app<br \/>\n[16:42:07][debug  ][test.cc:26]: \u5c0f\u660e\u4eca\u5e7418\u5c81<br \/>\n[16:42:07][info   ][test.cc:27]: \u5c0f\u7ea2\u4eca\u5e7419\u5c81<br \/>\n[16:42:07][warning][test.cc:28]: \u5c0f\u521a\u4eca\u5e7420\u5c81<br \/>\n[16:42:07][error  ][test.cc:29]: \u5c0f\u674e\u4eca\u5e7421\u5c81 <\/p>\n<hr \/>\n<h3 id=\"3.8-logger-&gt;flush-\u2014-\u5237\u65b0\u5f02\u6b65\u961f\u5217\">3.8 logger-&gt;flush \u2014 \u5237\u65b0\u5f02\u6b65\u961f\u5217<\/h3>\n<p>\u51fd\u6570\u7b7e\u540d<\/p>\n<p>void flush(); <\/p>\n<p>\u4f5c\u7528&#xff1a;\u5f02\u6b65\u6a21\u5f0f\u65e5\u5fd7\u5148\u8fdb\u5185\u5b58\u961f\u5217&#xff0c;flush() \u5f3a\u5236\u843d\u76d8\/\u8f93\u51fa\u3002\u7a0b\u5e8f\u9000\u51fa\u524d\u8c03\u4e00\u4e0b&#xff0c;\u9632\u6b62\u5d29\u6e83\u4e22\u65e5\u5fd7\u3002<\/p>\n<p>\u4ee3\u7801\u7247\u6bb5&#xff08;stdout.cc:33&#xff09;<\/p>\n<p>logger-&gt;flush();<br \/>\nreturn 0; <\/p>\n<hr \/>\n<h3 id=\"3.9-spdlog1-\u5c01\u88c5\uff1alog_settings-+-spdlog1_init-+-dbg\/inf\/wrn\/err\">3.9 spdlog1 \u5c01\u88c5&#xff1a;log_settings &#043; spdlog1_init &#043; DBG\/INF\/WRN\/ERR<\/h3>\n<p>log_settings \u7ed3\u6784\u4f53&#xff08;log.h:25-30&#xff09;<\/p>\n<p>struct log_settings {<br \/>\n    bool        async  &#061; false;                     \/\/ \u662f\u5426\u542f\u7528\u5f02\u6b65\u65e5\u5fd7<br \/>\n    int         level  &#061; 1;                         \/\/ 0~6 \u5bf9\u5e94 level_enum<br \/>\n    std::string format &#061; &#034;[%H:%M:%S][%-7l]: %v&#034;;    \/\/ \u65e5\u5fd7\u683c\u5f0f<br \/>\n    std::string path   &#061; &#034;stdout&#034;;                  \/\/ &#034;stdout&#034; \u6216 \u6587\u4ef6\u8def\u5f84<br \/>\n}; <\/p>\n<p>spdlog1_init \u5185\u90e8\u903b\u8f91&#xff08;log.cc:10-37&#xff09;<\/p>\n<p>1. async&#061;true  \u2192 init_thread_pool(8192, 1)<br \/>\n2. drop(&#034;stdout_logger&#034;) &#043; drop(&#034;file_logger&#034;)<br \/>\n3. \u6309 async &#043; path \u7ec4\u5408\u521b\u5efa logger<br \/>\n4. set_level &#043; set_pattern <\/p>\n<p>\u65e5\u5fd7\u5b8f&#xff08;log.h:39-44&#xff09;<\/p>\n<p>#define FMT_PREFIX &#034;[{}:{}]: &#034;<\/p>\n<p>#define DBG(fmt, &#8230;)  spdlog1::g_logger-&gt;debug(FMT_PREFIX fmt, __FILE__, __LINE__, ##__VA_ARGS__)<br \/>\n#define INF(fmt, &#8230;)  spdlog1::g_logger-&gt;info (FMT_PREFIX fmt, __FILE__, __LINE__, ##__VA_ARGS__)<br \/>\n#define WRN(fmt, &#8230;)  spdlog1::g_logger-&gt;warn (FMT_PREFIX fmt, __FILE__, __LINE__, ##__VA_ARGS__)<br \/>\n#define ERR(fmt, &#8230;)  spdlog1::g_logger-&gt;error(FMT_PREFIX fmt, __FILE__, __LINE__, ##__VA_ARGS__) <\/p>\n<p>\u5b8f\u7684\u9b54\u672f<\/p>\n<ul>\n<li>\n<p>FMT_PREFIX fmt&#xff1a;\u76f8\u90bb\u5b57\u7b26\u4e32\u7f16\u8bd1\u671f\u81ea\u52a8\u62fc\u63a5&#xff0c;\u96f6\u5f00\u9500\u3002&#034;[{}:{}]: &#034; &#034;{}\u4eca\u5e74{}\u5c81&#034; \u2192 &#034;[{}:{}]: {}\u4eca\u5e74{}\u5c81&#034;<\/p>\n<\/li>\n<li>\n<p>__FILE__ \/ __LINE__&#xff1a;\u7f16\u8bd1\u5668\u9884\u5b9a\u4e49\u5b8f&#xff0c;\u81ea\u52a8\u5e26\u6587\u4ef6\u540d\u548c\u884c\u53f7<\/p>\n<\/li>\n<li>\n<p>##__VA_ARGS__&#xff1a;\u6ca1\u989d\u5916\u53c2\u6570\u65f6\u628a\u9017\u53f7\u5403\u4e86&#xff0c;\u4e5f\u80fd\u7f16\u8bd1<\/p>\n<\/li>\n<\/ul>\n<p>\u8fd0\u884c\u7ed3\u679c<img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"153\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234905-6aadcdf10118a.png\" width=\"671\" \/><\/p>\n<hr \/>\n<h2 id=\"\u7b2c\u56db\u90e8\u5206\uff1a\u4e09\u5e93\u534f\u4f5c\u7684\u5b8c\u6574\u8fd0\u884c\u94fe\u8def\">\u7b2c\u56db\u90e8\u5206&#xff1a;\u4e09\u5e93\u534f\u4f5c\u7684\u5b8c\u6574\u8fd0\u884c\u94fe\u8def<\/h2>\n<h3 id=\"4.1-spdlog1-+-gflags-\u94fe\u8def\uff08test.cc\uff09\">4.1 spdlog1 &#043; gflags \u94fe\u8def&#xff08;test.cc&#xff09;<\/h3>\n<p>main()<br \/>\n\u251c\u2500\u2500 google::ParseCommandLineFlags        \u2190 gflags \u89e3\u6790\u547d\u4ee4\u884c<br \/>\n\u251c\u2500\u2500 \u7ec4\u88c5 log_settings                    \u2190 \u628a FLAGS \u642c\u8fdb\u914d\u7f6e<br \/>\n\u251c\u2500\u2500 spdlog1::spdlog1_init(settings)      \u2190 \u521d\u59cb\u5316 logger<br \/>\n\u2502   \u251c\u2500\u2500 init_thread_pool&#xff08;async&#061;true \u65f6&#xff09;\u2190 spdlog<br \/>\n\u2502   \u251c\u2500\u2500 spdlog::drop \u00d7 2                 \u2190 spdlog \u6e05\u7406\u65e7 logger<br \/>\n\u2502   \u251c\u2500\u2500 stdout_color_mt \/ basic_logger_mt \u2190 spdlog \u521b\u5efa logger<br \/>\n\u2502   \u251c\u2500\u2500 set_level                        \u2190 spdlog<br \/>\n\u2502   \u2514\u2500\u2500 set_pattern                      \u2190 spdlog<br \/>\n\u251c\u2500\u2500 DBG \/ INF \/ WRN \/ ERR                \u2190 spdlog1 \u5b8f\u5c55\u5f00<br \/>\n\u2502   \u2514\u2500\u2500 g_logger-&gt;debug\/info\/warn\/error  \u2190 spdlog \u8bb0\u5f55\u65e5\u5fd7<br \/>\n\u2514\u2500\u2500 return 0 <\/p>\n<h3 id=\"4.2-\u5de5\u7a0b\u6587\u4ef6\u603b\u89c8\">4.2 \u5de5\u7a0b\u6587\u4ef6\u603b\u89c8<\/h3>\n<table>\n<tbody>\n<tr>\n<p>\u5e93<\/p>\n<p>\u5de5\u7a0b\u76ee\u5f55<\/p>\n<p>\u5173\u952e\u6587\u4ef6<\/p>\n<p>\u7f16\u8bd1\u547d\u4ee4<\/p>\n<\/tr>\n<tr>\n<td>\n<p>gflags<\/p>\n<\/td>\n<td>\n<p>\/home\/dev\/workspace\/gflags\/<\/p>\n<\/td>\n<td>\n<p>main.cc &#043; child.cc &#043; main.conf<\/p>\n<\/td>\n<td>\n<p>g&#043;&#043; main.cc child.cc -o main -lgflags<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>gtest<\/p>\n<\/td>\n<td>\n<p>\/home\/dev\/workspace\/gtest\/<\/p>\n<\/td>\n<td>\n<p>simple.cc &#043; local.cc &#043; global.cc<\/p>\n<\/td>\n<td>\n<p>g&#043;&#043; xxx.cc -o xxx -lgtest<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>spdlog<\/p>\n<\/td>\n<td>\n<p>\/home\/dev\/workspace\/spdlog\/<\/p>\n<\/td>\n<td>\n<p>stdout.cc &#043; spdlog1\/log.h\/log.cc\/test.cc<\/p>\n<\/td>\n<td>\n<p>g&#043;&#043; xxx.cc -o xxx -lspdlog -lpthread -lfmt<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"\u81ea\u68c0\u6e05\u5355\">\u81ea\u68c0\u6e05\u5355<\/h2>\n<table>\n<tbody>\n<tr>\n<p>\u68c0\u67e5\u9879<\/p>\n<p>\u7ed3\u679c<\/p>\n<\/tr>\n<tr>\n<td>\n<p>gflags \u7f16\u8bd1<\/p>\n<\/td>\n<td>\n<p>\u00a0make clean &amp;&amp; make main \u901a\u8fc7<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>gtest \u7f16\u8bd1&#xff08;\u4e09\u4e2a&#xff09;<\/p>\n<\/td>\n<td>\n<p>\u00a0make clean &amp;&amp; make ALL \u901a\u8fc7<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>spdlog1 \u7f16\u8bd1<\/p>\n<\/td>\n<td>\n<p>\u00a0make clean &amp;&amp; make \u901a\u8fc7<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>gflags \u9ed8\u8ba4\u8fd0\u884c<\/p>\n<\/td>\n<td>\n<p>\u00a0\u8f93\u51fa 1\/8080\/0.0.0.0\/3.14\/0.0.0.0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>gflags \u547d\u4ee4\u884c\u8986\u76d6<\/p>\n<\/td>\n<td>\n<p>\u00a0-listen_port&#061;9090 \u751f\u6548<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>gflags \u914d\u7f6e\u6587\u4ef6<\/p>\n<\/td>\n<td>\n<p>\u00a0&#8211;flagfile&#061;main.conf \u751f\u6548<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>gtest simple<\/p>\n<\/td>\n<td>\n<p>3 tests passed<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>gtest local<\/p>\n<\/td>\n<td>\n<p>\u00a0\u751f\u547d\u5468\u671f\u8f93\u51fa\u987a\u5e8f\u6b63\u786e&#xff08;SetUpTestCase\u2192SetUp\u2192\u7528\u4f8b\u2192TearDown\u2192TearDownTestCase&#xff09;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>gtest global<\/p>\n<\/td>\n<td>\n<p>\u00a0Environment \u751f\u547d\u5468\u671f\u6b63\u786e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>spdlog1 \u9ed8\u8ba4<\/p>\n<\/td>\n<td>\n<p>\u00a05 \u884c\u5f69\u8272\u8f93\u51fa<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>spdlog1 -log_level&#061;4<\/p>\n<\/td>\n<td>\n<p>\u00a0\u53ea\u5269 1 \u884c error<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>spdlog1 \u6587\u4ef6\u8f93\u51fa<\/p>\n<\/td>\n<td>\n<p>\u00a0\u6587\u4ef6\u5185\u5bb9\u6b63\u786e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>stdout.cc<\/p>\n<\/td>\n<td>\n<p>\u00a010000 \u6761 error \u65e5\u5fd7<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>\u51fd\u6570\u7b7e\u540d vs \u7cfb\u7edf\u5934\u6587\u4ef6<\/p>\n<\/td>\n<td>\n<p>\u00a0InitGoogleTest \/ AddGlobalTestEnvironment \/ TEST \/ TEST_F \/ Environment \/ Test \/ init_thread_pool \/ stdout_color_mt \/ basic_logger_mt \/ drop \u5168\u90e8\u6838\u5bf9\u8fc7<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2>\u7b2c\u4e94\u90e8\u5206&#xff1a;\u4ee3\u7801\u5982\u4e0b&#xff1a;<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"828\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234905-6aadcdf117226.png\" width=\"234\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"431\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234905-6aadcdf12e0b9.png\" width=\"809\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"141\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234905-6aadcdf156871.png\" width=\"685\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"1068\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234905-6aadcdf16a5c3.png\" width=\"931\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"230\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234905-6aadcdf1d5020.png\" width=\"451\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"204\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234905-6aadcdf1ec3a2.png\" width=\"704\" \/><\/p>\n<hr \/>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"1681\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234906-6aadcdf20e722.png\" width=\"877\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"1615\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234906-6aadcdf2bc002.png\" width=\"846\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"1336\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234907-6aadcdf37606d.png\" width=\"1015\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"480\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234907-6aadcdf3ea253.png\" width=\"825\" \/><\/p>\n<hr \/>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"1358\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234908-6aadcdf4204b3.png\" width=\"1121\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"1446\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234908-6aadcdf49bc90.png\" width=\"1343\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"1124\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234909-6aadcdf5383fc.png\" width=\"1298\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"215\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234909-6aadcdf5afb28.png\" width=\"915\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"1189\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234909-6aadcdf5cd1c6.png\" width=\"1203\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"150\" src=\"2026-09-19yc3npbcivos.png\" width=\"759\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e09\u5957 C \u5fae\u670d\u52a1\u5e38\u7528\u5e93&#xff0c;\u9010\u4e2a\u63a5\u53e3\u62c6\u7ed9\u4f60\u770b\u3002\u6bcf\u4e2a\u63a5\u53e3\u7edf\u4e00\u683c\u5f0f&#xff1a;\u51fd\u6570\u7b7e\u540d \u2192 \u53c2\u6570\u8868 \u2192 \u4ee3\u7801\u7247\u6bb5 \u2192 \u8fd0\u884c\u7ed3\u679c\u3002 \u6240\u6709\u4ee3\u7801\u6765\u81ea \/home\/dev\/workspace\/ \u771f\u5b9e\u5de5\u7a0b&#xff0c;\u6240\u6709\u8fd0\u884c\u7ed3\u679c\u662f\u5b9e\u9645\u8dd1\u51fa\u6765\u7684\u3002 \u7b2c\u4e00\u90e8\u5206&#xff1a;gflags&#xff08;\u547d\u4ee4\u884c\u53c2\u6570\u89e3\u6790&#xff09;<br \/>\n1.1 DEFINE_bool \/ DEFINE_int32 \/ DEFINE_string \/ DEFINE_double \u2014 \u5b9a\u4e49\u547d\u4ee4\u884c\u53c2\u6570<\/p>\n","protected":false},"author":2,"featured_media":107227,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[12167,12168,12169,11653,55,371],"topic":[],"class_list":["post-107247","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-gflags","tag-gtest","tag-spdlog","tag-11653","tag-c","tag-371"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u3010C++\u5fae\u670d\u52a1\u9879\u76ee\u5f00\u53d1\u811a\u624b\u67b6\u3011\uff08\u63a5\u53e3\u7bc7\u4e00\uff09gflags + gtest + spdlog \u63a5\u53e3\u5b66\u4e60\u7b14\u8bb0 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/107247.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u3010C++\u5fae\u670d\u52a1\u9879\u76ee\u5f00\u53d1\u811a\u624b\u67b6\u3011\uff08\u63a5\u53e3\u7bc7\u4e00\uff09gflags + gtest + spdlog \u63a5\u53e3\u5b66\u4e60\u7b14\u8bb0 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u4e09\u5957 C \u5fae\u670d\u52a1\u5e38\u7528\u5e93&#xff0c;\u9010\u4e2a\u63a5\u53e3\u62c6\u7ed9\u4f60\u770b\u3002\u6bcf\u4e2a\u63a5\u53e3\u7edf\u4e00\u683c\u5f0f&#xff1a;\u51fd\u6570\u7b7e\u540d \u2192 \u53c2\u6570\u8868 \u2192 \u4ee3\u7801\u7247\u6bb5 \u2192 \u8fd0\u884c\u7ed3\u679c\u3002 \u6240\u6709\u4ee3\u7801\u6765\u81ea \/home\/dev\/workspace\/ \u771f\u5b9e\u5de5\u7a0b&#xff0c;\u6240\u6709\u8fd0\u884c\u7ed3\u679c\u662f\u5b9e\u9645\u8dd1\u51fa\u6765\u7684\u3002 \u7b2c\u4e00\u90e8\u5206&#xff1a;gflags&#xff08;\u547d\u4ee4\u884c\u53c2\u6570\u89e3\u6790&#xff09; 1.1 DEFINE_bool \/ DEFINE_int32 \/ DEFINE_string \/ DEFINE_double \u2014 \u5b9a\u4e49\u547d\u4ee4\u884c\u53c2\u6570\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/107247.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-18T23:49:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234904-6aadcdf007bc9.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/107247.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/107247.html\",\"name\":\"\u3010C++\u5fae\u670d\u52a1\u9879\u76ee\u5f00\u53d1\u811a\u624b\u67b6\u3011\uff08\u63a5\u53e3\u7bc7\u4e00\uff09gflags + gtest + spdlog \u63a5\u53e3\u5b66\u4e60\u7b14\u8bb0 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-09-18T23:49:11+00:00\",\"dateModified\":\"2026-09-18T23:49:11+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/107247.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/107247.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/107247.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u3010C++\u5fae\u670d\u52a1\u9879\u76ee\u5f00\u53d1\u811a\u624b\u67b6\u3011\uff08\u63a5\u53e3\u7bc7\u4e00\uff09gflags + gtest + spdlog \u63a5\u53e3\u5b66\u4e60\u7b14\u8bb0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u3010C++\u5fae\u670d\u52a1\u9879\u76ee\u5f00\u53d1\u811a\u624b\u67b6\u3011\uff08\u63a5\u53e3\u7bc7\u4e00\uff09gflags + gtest + spdlog \u63a5\u53e3\u5b66\u4e60\u7b14\u8bb0 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/107247.html","og_locale":"zh_CN","og_type":"article","og_title":"\u3010C++\u5fae\u670d\u52a1\u9879\u76ee\u5f00\u53d1\u811a\u624b\u67b6\u3011\uff08\u63a5\u53e3\u7bc7\u4e00\uff09gflags + gtest + spdlog \u63a5\u53e3\u5b66\u4e60\u7b14\u8bb0 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u4e09\u5957 C \u5fae\u670d\u52a1\u5e38\u7528\u5e93&#xff0c;\u9010\u4e2a\u63a5\u53e3\u62c6\u7ed9\u4f60\u770b\u3002\u6bcf\u4e2a\u63a5\u53e3\u7edf\u4e00\u683c\u5f0f&#xff1a;\u51fd\u6570\u7b7e\u540d \u2192 \u53c2\u6570\u8868 \u2192 \u4ee3\u7801\u7247\u6bb5 \u2192 \u8fd0\u884c\u7ed3\u679c\u3002 \u6240\u6709\u4ee3\u7801\u6765\u81ea \/home\/dev\/workspace\/ \u771f\u5b9e\u5de5\u7a0b&#xff0c;\u6240\u6709\u8fd0\u884c\u7ed3\u679c\u662f\u5b9e\u9645\u8dd1\u51fa\u6765\u7684\u3002 \u7b2c\u4e00\u90e8\u5206&#xff1a;gflags&#xff08;\u547d\u4ee4\u884c\u53c2\u6570\u89e3\u6790&#xff09; 1.1 DEFINE_bool \/ DEFINE_int32 \/ DEFINE_string \/ DEFINE_double \u2014 \u5b9a\u4e49\u547d\u4ee4\u884c\u53c2\u6570","og_url":"https:\/\/www.wsisp.com\/helps\/107247.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-09-18T23:49:11+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/09\/20260918234904-6aadcdf007bc9.png"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"9 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/107247.html","url":"https:\/\/www.wsisp.com\/helps\/107247.html","name":"\u3010C++\u5fae\u670d\u52a1\u9879\u76ee\u5f00\u53d1\u811a\u624b\u67b6\u3011\uff08\u63a5\u53e3\u7bc7\u4e00\uff09gflags + gtest + spdlog \u63a5\u53e3\u5b66\u4e60\u7b14\u8bb0 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-09-18T23:49:11+00:00","dateModified":"2026-09-18T23:49:11+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/107247.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/107247.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/107247.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u3010C++\u5fae\u670d\u52a1\u9879\u76ee\u5f00\u53d1\u811a\u624b\u67b6\u3011\uff08\u63a5\u53e3\u7bc7\u4e00\uff09gflags + gtest + spdlog \u63a5\u53e3\u5b66\u4e60\u7b14\u8bb0"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/107247","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=107247"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/107247\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/107227"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=107247"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=107247"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=107247"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=107247"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}