{"id":7419,"date":"2023-04-05T23:39:18","date_gmt":"2023-04-05T15:39:18","guid":{"rendered":"https:\/\/yanjingang.com\/blog\/?p=7419"},"modified":"2023-05-10T17:47:10","modified_gmt":"2023-05-10T09:47:10","slug":"c%e5%8a%a8%e6%80%81%e5%af%b9%e8%b1%a1%e5%88%9b%e5%bb%ba","status":"publish","type":"post","link":"https:\/\/yanjingang.com\/blog\/?p=7419","title":{"rendered":"C++\u53cd\u5c04\u5b9e\u73b0\u2014\u6839\u636e\u7c7b\u540d\u52a8\u6001\u521b\u5efa\u5bf9\u8c61"},"content":{"rendered":"<p>\u6211\u4eec\u5728\u7f16\u5199C++\u6846\u67b6\u65f6\uff0c\u7ecf\u5e38\u4f1a\u6d89\u53ca\u5230\u4e00\u9879\u57fa\u7840\u6280\u672f\uff0c\u5c31\u662f\u6839\u636e\u201c\u4e00\u4e2a\u52a8\u6001\u5e93 + \u4e00\u4e2a\u7c7b\u540d\u79f0\u5b57\u7b26\u4e32\u201c\uff0c\u52a8\u6001\u7684\u521b\u5efa\u7c7b\u5bf9\u8c61\u3002<\/p>\n<p>\u8fd9\u6837\u505a\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5b9e\u73b0\u6846\u67b6\u4e0e\u4e1a\u52a1\u4ee3\u7801\u7684\u5f7b\u5e95\u89e3\u8026\u3002\u6846\u67b6\u4e0d\u7528\u5173\u5fc3\u4e1a\u52a1\u4fa7\u7684\u5177\u4f53\u5b9e\u73b0\u7ec6\u8282\uff0c\u53ea\u9700\u8981\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7c7b\u7531\u4e1a\u52a1\u65b9\u7ee7\u627f\u5b9e\u73b0\uff0c\u7136\u540e\u4e1a\u52a1\u65b9\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u914d\u7f6e\u5bf9\u5e94\u7684\u52a8\u6001\u5e93+\u7c7b\u540d\u79f0\u5373\u53ef\u5b9e\u73b0\u81ea\u52a8\u52a0\u8f7d\u5e76\u8fd0\u884c\u3002\u6211\u4eec\u901a\u5e38\u628a\u8fd9\u7c7b\u529f\u80fd\u79f0\u4e3aclassloader\uff0c\u4eca\u5929\u5c31\u5e26\u5927\u5bb6\u4e00\u8d77\u6765\u5b9e\u73b0\u4e0b\u3002<\/p>\n<h1>\u4e00\u3001\u5b9e\u73b0\u539f\u7406<\/h1>\n<p>classloader\u4e00\u822c\u5305\u542bshared_library\u52a8\u6001\u5e93\u52a0\u8f7d\/\u5378\u8f7d\u3001object_factory\u52a8\u6001\u5bf9\u8c61\u521b\u5efa\u5de5\u5382\u3001class_register\u52a8\u6001\u7c7b\u6ce8\u518c\uff0c\u4ee5\u53caclass_loader\u7edf\u4e00\u7ba1\u7406\u90e8\u5206\u3002\u6574\u4f53\u5173\u7cfb\u5982\u4e0b\u56fe\uff1a<\/p>\n<p><img loading=\"lazy\" class=\"aligncenter wp-image-7450\" title=\"classloader\" src=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2023\/04\/classloader-8.png\" sizes=\"(max-width: 1031px) 100vw, 1031px\" srcset=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2023\/04\/classloader-8.png 1031w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2023\/04\/classloader-8-300x128.png 300w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2023\/04\/classloader-8-1024x438.png 1024w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2023\/04\/classloader-8-768x329.png 768w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2023\/04\/classloader-8-624x267.png 624w\" alt=\"\" width=\"1031\" height=\"441\" \/><\/p>\n<p>\u52a8\u6001\u5bf9\u8c61\u521b\u5efa\u7684\u5173\u952e\u662f\uff0c\u6846\u67b6\u4e0d\u77e5\u9053\u4e1a\u52a1\u7c7b\u7684\u4efb\u4f55\u4fe1\u606f\uff0c\u6240\u4ee5\u9700\u8981\u4e1a\u52a1\u4fa7\u5728\u5b9e\u73b0Derived\u7c7b\uff08\u5373\u56fe\u4e2dDemoComponent\uff09\u4e4b\u540e\uff0c\u4f7f\u7528REGISTER_CLASS\u5b8f\u6ce8\u518c\u7c7b\u4ee5\u8ba9\u6846\u67b6\u77e5\u6653\uff08\u6ce8\u518c\u65f6\uff0c\u5b8f\u9700\u8981\u81ea\u52a8\u4e3a\u7c7b\u751f\u6210\u4e00\u4e2aCreater\u65b9\u6cd5\u5e76\u6ce8\u518c\u7ed9ObjectFactory\uff0c\u56e0\u6b64\u4fdd\u5b58\u6ce8\u518c\u4fe1\u606f\u7684ObjectFactory\u9700\u8981\u4f7f\u7528\u5355\u4f8b\uff09\u3002<\/p>\n<p>\u6846\u67b6\u6301\u6709\u6bcf\u4e2a\u4e1a\u52a1\u7ec4\u4ef6\u7c7b\u7684Creater\u65b9\u6cd5\u4e4b\u540e\uff0c\u5728\u9700\u8981\u521b\u5efaCreateObject\u65f6\u4f7f\u7528\u5355\u4f8b\u4fdd\u5b58\u7684\u4e1a\u52a1\u7c7b\u6ce8\u518ccreater\u5373\u53ef\u521b\u5efa\u5bf9\u5e94\u5bf9\u8c61\u3002<\/p>\n<h1>\u4e8c\u3001\u5177\u4f53\u5b9e\u73b0<\/h1>\n<h4>1\u3001shared_library\u52a8\u6001\u5e93\u52a0\u8f7d\/\u5378\u8f7d<\/h4>\n<p>\u8fd9\u90e8\u5206\u662f\u6700\u7b80\u5355\u7684\uff0c\u6211\u4eec\u4f7f\u7528dlopen\u3001dlclose\u6765\u5b9e\u73b0\u5373\u53ef\uff0c\u7b80\u5355\u7684\u5c01\u88c5\u4e0b\uff0c\u8fd9\u91cc\u4e0d\u8d58\u8ff0\uff0c\u6211\u4eec\u91cd\u70b9\u8bb2\u89e3\u540e\u7eed\u90e8\u5206\u3002<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\">class SharedLibrary {\r\n    ...\r\n    bool Load(const std::string &amp;libraryFile){\r\n        ...\r\n        \/\/ Load so \r\n        _libraryHandle = dlopen(libraryFile.c_str(), real_flag); \r\n        if (!_libraryHandle) { \r\n            const char *err = dlerror(); \r\n            LOG(ERROR) &lt;&lt; \"Library [\" &lt;&lt; libraryFile &lt;&lt; \"] load fail: \" &lt;&lt; std::string(err); \r\n            return false; \r\n        }\r\n        ...\r\n    }\r\n    ...\r\n    bool UnLoad(){ \r\n        ...\r\n        \/\/ UnLoad so \r\n        if (_libraryHandle) { \r\n            LOG(INFO) &lt;&lt; \"UnLoad\"; \r\n            dlclose(_libraryHandle); \r\n            _libraryHandle = nullptr;\r\n        }\r\n        ...\r\n    }\r\n    ...\r\n}<\/code><\/pre>\n<h4>2\u3001object_factory\u5bf9\u8c61\u521b\u5efa\u5de5\u5382\u4e0eclass_register\u52a8\u6001\u7c7b\u6ce8\u518c<\/h4>\n<p>object_factory\u5bf9\u8c61\u5de5\u5382\u662fclassloader\u7684\u6838\u5fc3\uff0c\u51b3\u5b9a\u4e86\u5982\u4f55\u5b8c\u5168\u677e\u8026\u5408\u7684\u5b9e\u73b0\u52a8\u6001\u7c7b\u521b\u5efa\u3002class_register\u4f5c\u4e3a\u8f85\u52a9\uff0c\u4e3aobject_factory\u7684\u9884\u5148\u6ce8\u518c\u63d0\u4f9b\u5b8f\u652f\u6301\u3002<\/p>\n<h6>2.1 \u65b0\u624b\u5165\u95e8<\/h6>\n<p>\u63d0\u5230\u52a8\u6001\u521b\u5efa\u5bf9\u8c61\uff0c\u76f8\u4fe1\u65b0\u624b\u60f3\u5230\u7684\u6700\u7b80\u5355\u7684\u65b9\u6cd5\u901a\u5e38\u5982\u4e0b\uff1a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\">void CreateObject(std::string ObjName)\r\n{\r\n    if(ObjName == \u201cA\u201d)\r\n    {\r\n        new A;\r\n    }\r\n    else if(ObjName == \u201cB\u201d)\r\n    {\r\n        new B;\r\n    }\r\n    ...\r\n}<\/code><\/pre>\n<p>\u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u6846\u67b6\u7f16\u5199\u65f6\u5e76\u4e0d\u77e5\u9053\u4e1a\u52a1\u8981\u8d77\u4ec0\u4e48\u7c7b\u540d\uff0c\u6846\u67b6\u7f16\u8bd1\u65f6\u4e5f\u6ca1\u6709\u8fd9\u4e9b\u7c7b\u7684so\u5e93\uff0c\u53c8\u5982\u4f55\u5728\u4ee3\u7801\u4e2d\u63d0\u524d\u7f16\u5199new \u7c7b\u540d\u7684\u4ee3\u7801\u5462\uff1f\u51b5\u4e14\u4e1a\u52a1\u4ee3\u7801\u4e00\u76f4\u5728\u53d8\uff0c\u6846\u67b6\u600e\u4e48\u53ef\u80fd\u8ddf\u7740\u4e1a\u52a1\u53d8\u5316\u4e00\u76f4\u4fee\u6539\u8fd9\u4e9b\u5730\u65b9\u5462\uff1f\u663e\u7136\u8fd9\u79cd\u65b9\u6cd5\u662f\u4e0d\u53ef\u884c\u7684\u3002<\/p>\n<h6>2.2 \u5b8f\u6ce8\u518c<\/h6>\n<p>\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u63a5\u4e0b\u6765\u5f88\u591a\u540c\u5b66\u4f1a\u60f3\u5230\u53ef\u4ee5\u7528\u5b8f\u6765\u5b9e\u73b0\u4f20\u5165\u5b57\u7b26\u4e32\uff0cnew\u51fa\u5bf9\u5e94\u7684\u7c7b\uff0c\u8fd9\u4e2a\u601d\u8def\u5f88\u597d\uff0c\u6240\u4ee5\u6211\u4eec\u63a5\u4e0b\u6765\u5b9e\u73b0\u4e86\u4e00\u4e2a\u5b8f\u5b9a\u4e49\uff1a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\">\/\/ \u52a8\u6001\u6ce8\u518c\u7c7bcreator\r\n#define REGISTER_CLASS(ClassName)                                                            \\\r\n  ClassName *Create##ClassName()                                                             \\\r\n  {                                                                                          \\\r\n    return new ClassName;                                                                    \\\r\n  }                                                                                          \\\r\n  static bool g_reg_##ClassName = ObjectFactory::GetInstance()-&gt;Register(#Derived, Create##UniqueID);\r\n<\/code><\/pre>\n<p>\u4e0a\u9762\u8fd9\u4e2a\u5b8f\u5f88\u7b80\u5355\uff0c\u9996\u5148\u662f\u5b9a\u4e49\u4e86\u4e00\u4e2anew\u5bf9\u8c61\u7684\u51fd\u6570\uff0cnew\u4e00\u4e2a\u4f20\u5165\u7c7b\u540d\u7684\u5bf9\u8c61\u3002\u63a5\u7740\u5b9a\u4e49\u4e86\u4e00\u4e2astatic g_reg_xx\u53d8\u91cf\uff0c\u8fd9\u4e2a\u53d8\u91cf\u88ab\u521d\u59cb\u5316\u7684\u65f6\u5019\uff0c\u4f1a\u8c03\u7528\u5230ObjectFactory::Register\u6765\u4fdd\u5b58\u7c7b\u540d\u548c\u7c7bcreater\u65b9\u6cd5\u7684\u5173\u7cfb\u3002\u8fd9\u91cc\u6211\u4eec\u4f7f\u7528static GetInstance\u5355\u4f8b\u51fd\u6570\uff0c\u786e\u4fdd\u5728\u6240\u6709static g_reg_xx\u5bf9\u8c61\u6784\u9020\u4e4b\u524d\uff0cObjectFactory\u5355\u4f8b\u5bf9\u8c61\u5df2\u7ecf\u5b8c\u6210\u4e86\u521d\u59cb\u5316\u3002\u8fd9\u91cc\u7684static g_reg_xx\u53d8\u91cf\u4e5f\u53ef\u4ee5\u4f7f\u7528struct\u6784\u9020\u51fd\u6570\u6765\u4ee3\u66ff\uff0c\u76ee\u7684\u90fd\u662f\u4e3a\u4e86\u5728\u52a0\u8f7dREGISTER_CLASS\u4ee3\u7801\u4e4b\u540e\u5c31\u80fd\u81ea\u52a8\u521b\u5efa\u4e00\u4e2astatic\u5bf9\u8c61\uff0c\u4ece\u800c\u81ea\u52a8\u5b8c\u6210\u7c7b\u6ce8\u518c\u52a8\u4f5c\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u8981\u5b9e\u73b0\u4e0bRegister\u903b\u8f91\uff0c\u8fd9\u91cc\u6bd4\u8f83\u7b80\u5355\uff0c\u5b9e\u73b0\u4e00\u4e2aObjectFactory\u5355\u4f8b\uff0c\u628aRegister\u4f20\u5165\u7684\u7c7b\u540d\u548c\u7c7bcreater\u65b9\u6cd5\u4fdd\u5b58\u4e0b\u6765\u5907\u7528\u5373\u53ef\uff1a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\">class ObjectFactory{\r\n        \/\/ \u52a8\u6001\u6ce8\u518c\u7c7b\r\n        using ObjCreator = std::function&lt;Object *(void)&gt;;\r\n        bool Register(const std::string &amp;className, ObjCreator objCreator)\r\n        {\r\n            LOG(INFO) &lt;&lt; \"Register \" &lt;&lt; className;\r\n            _creatorMap.insert(std::make_pair(className, objCreator));\r\n            LOG(INFO) &lt;&lt; \"_creatorMap size: \" &lt;&lt; _creatorMap.size();\r\n            return true;\r\n        }\r\n        ...\r\n}<\/code><\/pre>\n<p>\u5199\u5230\u8fd9\u91cc\uff0c\u6211\u4eec\u4f1a\u53d1\u73b0objCreator\u4f5c\u4e3aRegister\u7684\u901a\u7528Creator\u53c2\u6570\uff0c\u5b9a\u4e49\u7684\u8fd4\u56de\u503c\u8981\u60f3\u4fdd\u6301\u4e00\u81f4\uff0c\u9700\u8981\u4e00\u4e2a\u7c7b\u4f3cObject\u7684\u57fa\u7840\u7c7b\u3002\u6211\u4eec\u53ef\u4ee5\u636e\u6b64\u5b9e\u73b0\u8fd9\u4e2aObject\u57fa\u7c7b\uff0c\u5e76\u8981\u6c42\u6240\u6709\u7684\u52a8\u6001\u7c7b\u90fd\u7ee7\u627f\u5b83\u3002\u4f46\u662f\u95ee\u9898\u6765\u4e86\uff0c\u6709\u4e9b\u7c7b\u4e3a\u4e86\u65b9\u4fbf\u5728\u7c7b\u51fd\u6570\u4e2d\u628a\u7c7b\u5bf9\u8c61\u4f5c\u4e3a\u53c2\u6570\u4f20\u7ed9\u5916\u90e8\u7b49\u539f\u56e0\uff0c\u5df2\u7ecf\u7ee7\u627f\u4e86enable_shared_from_this&lt;xxx&gt;\u7b49\u5176\u4ed6\u57fa\u7c7b\uff0c\u800c\u4f7f\u7528\u591a\u7ee7\u627f\u5219\u5bb9\u6613\u8ba9\u4ee3\u7801\u903b\u8f91\u53d8\u5f97\u6bd4\u8f83\u590d\u6742\u3002<\/p>\n<h6>2.3 \u6a21\u677f<\/h6>\n<p>\u4e3a\u4e86\u89e3\u51b3\u4e0a\u8fb9\u7684\u95ee\u9898\uff0c\u6211\u4eec\u53c8\u60f3\u5230\u4e86\u4e00\u4e2a\u89e3\u51b3\u65b9\u6cd5\uff0c\u90a3\u5c31\u662f\u4f7f\u7528\u6a21\u677f\u6765\u89e3\u51b3\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u9884\u5148\u77e5\u9053\u4e1a\u52a1\u7c7b\u7684\u57fa\u7c7b\u4e86\u3002\u6211\u4eec\u5bf9ObjectFactory\u8fdb\u884c\u4e0b\u6a21\u677f\u6539\u9020\uff0c\u5e76\u5b9e\u73b0CreateObject\u65b9\u6cd5\uff1a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\">template &lt;typename Base&gt;\r\nclass ObjectFactory {\r\n    ...\r\n    \/\/ \u52a8\u6001\u6ce8\u518c\u7c7b\r\n    using ObjCreator = std::function&lt;Base *(void)&gt;; \r\n    bool Register(const std::string &amp;className, ObjCreator objCreator)\r\n    {\r\n        LOG(INFO) &lt;&lt; \"Register \" &lt;&lt; className;\r\n        _creatorMap.insert(std::make_pair(className, objCreator)); \r\n        LOG(INFO) &lt;&lt; \"_creatorMap size: \" &lt;&lt; _creatorMap.size();\r\n        return true;\r\n    }\r\n    ...\r\n    \/\/ \u52a8\u6001\u521b\u5efa\u7c7b\u5bf9\u8c61\r\n    std::shared_ptr&lt;Base&gt; CreateObject(const std::string &amp;className)\r\n    {\r\n        LOG(INFO) &lt;&lt; \"CreateObject \" &lt;&lt; className &lt;&lt; \" _creatorMap size: \" &lt;&lt; _creatorMap.size();\r\n        auto it = _creatorMap.find(className);\r\n        if (it == _creatorMap.end())\r\n        {\r\n            LOG(ERROR) &lt;&lt; className &lt;&lt; \" class not registed!\";\r\n            return nullptr;\r\n        }\r\n        return std::shared_ptr&lt;Base&gt;(it-&gt;second());\r\n    }\r\n    ...\r\n}\r\n<\/code><\/pre>\n<p>REGISTER_CLASS\u5b8f\u4e5f\u9700\u8981\u540c\u6b65\u8c03\u6574\u4e0b\uff0c\u589e\u52a0\u57fa\u7c7b\u548c\u6a21\u677f\uff1a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\">\/\/ \u52a8\u6001\u6ce8\u518c\u7c7bcreator\uff08\u5b50\u7c7b\u3001\u57fa\u7c7b\uff09\r\n#define REGISTER_CLASS(Derived, Base)                                                        \\\r\n  Derived *Create##Derived()                                                                 \\\r\n  {                                                                                          \\\r\n    return new Derived;                                                                      \\\r\n  }                                                                                          \\\r\n  static bool g_reg_##Derived = ObjectFactory&lt;Base&gt;::GetInstance()-&gt;Register(#Derived, Create##Derived);\r\n<\/code><\/pre>\n<p>\u5728\u7279\u5b9a\u7c7b\u578b\u7ec4\u4ef6\u573a\u666f\u4e0b\uff0c\u57fa\u7c7b\u662f\u56fa\u5b9a\u7684\uff0c\u4e3a\u4e86\u65b9\u4fbf\u4e1a\u52a1\u65b9REGISTER\uff0c\u6211\u4eec\u53ef\u4ee5\u989d\u5916\u4e3a\u8fd9\u4e9b\u7ec4\u4ef6\u5355\u72ec\u5b9a\u4e49\u5b8f\uff0c\u4ee5\u51cf\u5c11REGISTER\u53c2\u6570\uff0c\u4f8b\u5982\uff1a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\">#define REGISTER_COMPONENT(Derived)   \\\r\n     REGISTER_CLASS(Derived, ComponentBase)<\/code><\/pre>\n<p>\u901a\u8fc7\u6a21\u677f\u5316\u6539\u9020\uff0c\u6211\u4eec\u7684\u5c01\u88c5\u5df2\u7ecf\u987a\u5229\u5b9e\u73b0\u4e86\u4e0e\u4e1a\u52a1\u4fa7\u7684\u89e3\u8026\uff0c\u552f\u4e00\u9700\u8981\u4e1a\u52a1\u4fa7\u4ec5\u9700\u8981\u5728\u5b9e\u73b0\u4e1a\u52a1\u7c7b\u7684\u65f6\u5019\u8c03\u7528REGISTER_CLASS\u8fdb\u884c\u6ce8\u518c\u5373\u53ef\u3002\u7531\u4e8e\u662f\u5168\u5c40static\uff0c\u5f53\u4e1a\u52a1\u7684so\u52a8\u6001\u5e93\u88ab\u52a0\u8f7d\u65f6\uff0c\u5373\u53ef\u81ea\u52a8\u5b8c\u6210\u6ce8\u518c\u52a8\u4f5c\u3002<\/p>\n<h4>3\u3001class_loader\u7edf\u4e00\u7ba1\u7406<\/h4>\n<p>\u4e3a\u4e86\u65b9\u4fbf\u5bf9\u52a8\u6001\u52a0\u8f7d\u7684so\u5e93\u548c\u521b\u5efa\u7684obj\u5bf9\u8c61\u8fdb\u884c\u7edf\u4e00\u7ba1\u7406\uff0c\u6211\u4eec\u9700\u8981\u6709\u4e00\u4e2a\u7c7b\u4f3cmanager\u7684\u7c7b\uff0c\u4f5c\u4e3aclassloader\u5165\u53e3\u7684\u540c\u65f6\uff0c\u6301\u6709\u548c\u7ba1\u7406\u76f8\u5173\u8d44\u6e90\u3002<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\">class ClassLoader\r\n{\r\n    ...\r\n    \/\/ load one library\r\n    bool ClassLoader::LoadLibrary(const std::string &amp;libraryFile)\r\n    {\r\n        if (!IsLoaded(libraryFile))\r\n        {\r\n            LOG(INFO) &lt;&lt; \"LoadLibrary \" &lt;&lt; libraryFile;\r\n            _libloaderMap[libraryFile] = std::make_shared&lt;SharedLibrary&gt;(libraryFile);\r\n        }\r\n        return IsLoaded(libraryFile);\r\n    }\r\n    ...\r\n    \/\/ create Base Object\r\n    template &lt;typename Base&gt;\r\n    std::shared_ptr&lt;Base&gt; CreateObject(const std::string &amp;className)\r\n    {\r\n        return ObjectFactory&lt;Base&gt;::GetInstance()-&gt;CreateObject(className);\r\n    }\r\n    ...\r\n    void ClassLoader::Release()\r\n    {\r\n        \/\/ unload all library\r\n        LOG(INFO) &lt;&lt; \"Release All Library\";\r\n        for (auto loader : _libloaderMap)\r\n        {\r\n            UnloadLibrary(loader.first);\r\n        }\r\n    }\r\n};<\/code><\/pre>\n<h4>4\u3001\u6d4b\u8bd5<\/h4>\n<p>\u6211\u4eec\u5b9e\u9645\u6d4b\u8bd5\u4e0b\u52a8\u6001\u52a0\u8f7d\u6548\u679c\uff1a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\">int main()\r\n{\r\n    \/\/ create obj\r\n    std::string libraryFile(\"libdemo_component.so\");\r\n    std::string className(\"DemoComponent\");\r\n\r\n    ClassLoader classloader;\r\n    \/\/ load so lib\r\n    auto ret = classloader.LoadLibrary(libraryFile);\r\n    std::cout &lt;&lt; \"LoadLibrary: \" &lt;&lt; ret &lt;&lt; std::endl;\r\n\r\n    \/\/ create object\r\n    std::shared_ptr&lt;ComponentBase&gt; obj = classloader.CreateObject&lt;ComponentBase&gt;(className);\r\n    obj-&gt;Init();\r\n\r\n    return 0;\r\n}<\/code><\/pre>\n<pre class=\"pure-highlightjs\"><code class=\"\">I0406 23:16:19.192689 31550 class_loader.cc:30 ClassLoader()\r\nI0406 23:16:19.192725 31550 class_loader.cc:44 LoadLibrary libdemo_component.so\r\nI0406 23:16:19.192752 31550 shared_library.cc:12 SharedLibrary() libdemo_component.so\r\nI0406 23:16:19.192759 31550 shared_library.cc:24 Load libdemo_component.so\r\nI0406 23:16:19.193063 31550 object_factory.h:36 ObjectFactory Instance is initializing\r\nObjectFactory() ObjectFactory_1680774079193100\r\nI0406 23:16:19.193133 31550 object_factory.h:47 Register DemoComponent\r\nI0406 23:16:19.193186 31550 object_factory.h:50 _creatorMap size: 1\r\nI0406 23:16:19.193351 31550 object_factory.h:60 CreateObject DemoComponent _creatorMap size: 1\r\nI0406 23:16:19.193377 31550 component_base.cc:25 ComponentBase()\r\nI0406 23:16:19.193392 31550 demo_component.h:29 DemoComponent()\r\nI0406 23:16:19.193405 31550 demo_component.cc:25 DemoComponent Init()\r\nI0406 23:16:19.193413 31550 demo_component.h:33 ~DemoComponent()\r\nI0406 23:16:19.193423 31550 component_base.cc:46 ~ComponentBase()\r\nI0406 23:16:19.193445 31550 class_loader.cc:35 ~ClassLoader()\r\nI0406 23:16:19.193454 31550 class_loader.cc:85 Release All Library\r\nI0406 23:16:19.193462 31550 class_loader.cc:75 UnLoading Library libdemo_component.so\r\nI0406 23:16:19.193472 31550 shared_library.cc:62 UnLoad\r\nI0406 23:16:19.193552 31550 shared_library.cc:18 ~SharedLibrary()\r\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h1>\u4e09\u3001\u603b\u7ed3<\/h1>\n<p>\u597d\u4e86\uff0c\u622a\u81f3\u5230\u73b0\u5728\uff0c\u6211\u4eec\u5df2\u7ecf\u57fa\u672c\u5b9e\u73b0\u4e86\u4e00\u4e2a\u52a8\u6001\u521b\u5efa\u5bf9\u8c61\u7684classloader\u5c01\u88c5\u96cf\u5f62\u3002\u4f46\u4e5f\u53ef\u4ee5\u770b\u5230\u4ed6\u8fd8\u5f88\u4e0d\u5b8c\u5584\uff0c\u6bd4\u5982\u4e0d\u652f\u6301\u6784\u9020\u51fd\u6570\u4f20\u53c2\u3001\u4e0d\u652f\u6301\u5e76\u884c\u52a0\u8f7d\/\u5bf9\u8c61\u521b\u5efa\u7b49\u3002\u5982\u679c\u4f60\u5bf9\u6b64\u611f\u5174\u8da3\u8bf7\u7ed9\u6211\u7559\u8a00\uff0c\u6211\u4eec\u4e00\u8d77\u6765\u7ee7\u7eed\u5b8c\u5584\u5b83\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>yan 23.4.5<\/p>\n<p>&nbsp;<\/p>\n<p>\u53c2\u8003\uff1a<\/p>\n<p><a href=\"https:\/\/blog.csdn.net\/xiaoqiang321\/article\/details\/128698461\" target=\"_blank\" rel=\"noopener\">C++\u6846\u67b6\u6280\u672f-\u6839\u636e\u7c7b\u540d\u52a8\u6001\u521b\u5efa\u7c7b\u5bf9\u8c61<\/a><\/p>\n<p><a href=\"https:\/\/zhuanlan.zhihu.com\/p\/448899077\" target=\"_blank\" rel=\"noopener\">C++\u53cd\u5c04\u5b9e\u73b0\u52a8\u6001\u5bf9\u8c61\u521b\u5efa<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u4eec\u5728\u7f16\u5199C++\u6846\u67b6\u65f6\uff0c\u7ecf\u5e38\u4f1a\u6d89\u53ca\u5230\u4e00\u9879\u57fa\u7840\u6280\u672f\uff0c\u5c31\u662f\u6839\u636e\u201c\u4e00\u4e2a\u52a8\u6001\u5e93 + \u4e00\u4e2a\u7c7b\u540d\u79f0\u5b57\u7b26\u4e32\u201c\uff0c\u52a8\u6001\u7684\u521b\u5efa\u7c7b\u5bf9 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[1027,1293],"tags":[877,1277,1276,1275,1274,1273],"_links":{"self":[{"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/7419"}],"collection":[{"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7419"}],"version-history":[{"count":4,"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/7419\/revisions"}],"predecessor-version":[{"id":7471,"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/7419\/revisions\/7471"}],"wp:attachment":[{"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}