{"id":26283031,"url":"https://github.com/abin-z/dynamiclibloading","last_synced_at":"2025-03-14T17:16:29.930Z","repository":{"id":273232858,"uuid":"918915227","full_name":"abin-z/DynamicLibLoading","owner":"abin-z","description":".so或.dll动态库无头文件显式加载案例","archived":false,"fork":false,"pushed_at":"2025-02-23T14:25:15.000Z","size":19,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-23T15:19:05.699Z","etag":null,"topics":["cmake","cpp","dynamic-programming","explicit-loading","library"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/abin-z.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-19T07:54:52.000Z","updated_at":"2025-02-23T14:28:35.000Z","dependencies_parsed_at":"2025-01-19T17:25:20.042Z","dependency_job_id":"7d04cbd5-6cf3-4633-85dd-ab977158c3d1","html_url":"https://github.com/abin-z/DynamicLibLoading","commit_stats":null,"previous_names":["abin-z/dynamiclibloading"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abin-z%2FDynamicLibLoading","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abin-z%2FDynamicLibLoading/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abin-z%2FDynamicLibLoading/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abin-z%2FDynamicLibLoading/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abin-z","download_url":"https://codeload.github.com/abin-z/DynamicLibLoading/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243615620,"owners_count":20319733,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cmake","cpp","dynamic-programming","explicit-loading","library"],"created_at":"2025-03-14T17:16:29.399Z","updated_at":"2025-03-14T17:16:29.913Z","avatar_url":"https://github.com/abin-z.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 跨平台动态库显式加载案例\n\n本项目主要实现了**跨平台的显式加载动态库**的功能, 功能比较简单, 主要是记录动态库的显式加载流程.\n\n- 封装了跨平台的[动态库显式加载模块](./application/dynamicLibrary.hpp): `application/dynamicLibrary.hpp`\n- 跨平台的[动态库导出头文件](./dynamic/include/dynamic/dll_export.h): `dynamic/include/dynamic/dll_export.h`\n- `dynamic`目录是一个独立动态库模块(比较简单).\n- `application`目录是独立程序, 其中会在代码中显式加载dynamic动态库.\n\n项目文件目录:\n\n```sh\n.\n├── application\n│   ├── CMakeLists.txt\n│   ├── dynamicLibrary.hpp\n│   └── main.cpp\n├── docs\n│   └── 动态库的加载方式介绍.md\n├── dynamic\n│   ├── CMakeLists.txt\n│   ├── include\n│   │   └── dynamic\n│   │       ├── common.hpp\n│   │       ├── dll_export.h\n│   │       └── dynamic.h\n│   └── src\n│       └── dynamic.cpp\n└── README.md\n```\n\n### 点击查看: [动态库加载方式介绍](./docs/动态库的加载方式介绍.md)\n\n### 动态库的加载方式主要有以下两种\n\n1. **显式加载 (Explicit Loading)**\n\n   显式加载动态库是通过在运行时使用特定的函数来加载动态库，通常需要提供库的路径和库的符号名称。这种方法需要程序员在代码中明确调用库加载和符号解析函数。\n\n   - **Windows**：使用 `LoadLibrary` 加载动态库，使用 `GetProcAddress` 获取库中函数的地址。\n   - **Linux/Unix**：使用 `dlopen` 加载动态库，使用 `dlsym` 获取库中函数的地址。\n   - 这种方式通常用于插件系统、动态加载模块等场景。\n\n2. **隐式加载 (Implicit Loading)**\n\n   隐式加载是指在程序启动时，操作系统会根据可执行文件的要求自动加载所依赖的动态库。程序员不需要显式地调用加载函数，只需要在程序的构建过程中指定库的依赖。\n\n   - **Windows**：通过 `dllimport` 声明来隐式加载动态库，操作系统会在启动时根据需要加载动态库。\n   - **Linux/Unix**：通过 `ld` (链接器) 指定库依赖，操作系统会在运行时自动加载。\n\n### 显式加载和隐式加载使用场景\n\n- **隐式加载**适用于：依赖固定且少变、无需动态选择库的场景，简化了开发和维护工作。\n- **显式加载**适用于：需要动态加载库、插件或模块化设计、按需选择库、热更新等场景，提供更大的灵活性和控制力。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabin-z%2Fdynamiclibloading","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabin-z%2Fdynamiclibloading","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabin-z%2Fdynamiclibloading/lists"}