fix(module): 确保核心模块在静态链接时被正确注册

修复静态链接时核心模块可能未被注册的问题,通过添加 ensureCoreModulesRegistered 方法并在 createAndInitAll 中调用
改进 E2D_MODULE 宏使用 constructor 属性确保注册
添加核心模块的静态注册代码
同时完善 shader 加载的错误日志
This commit is contained in:
ChestnutYueyue 2026-02-16 14:12:56 +08:00
parent ea1bbb891d
commit 367de0e611
5 changed files with 67 additions and 6 deletions

View File

@ -58,12 +58,21 @@ struct ModuleAutoRegister {
* @brief
*
*
* 使 constructor main
*/
#define E2D_MODULE(ModuleClassName, priorityValue, ...) \
__attribute__((used)) \
namespace { \
struct E2D_CONCAT(ModuleReg_, ModuleClassName) { \
::extra2d::detail::ModuleAutoRegister< ::extra2d::ModuleClassName> reg; \
E2D_CONCAT(ModuleReg_, ModuleClassName)() : reg(#ModuleClassName, priorityValue, { __VA_ARGS__ }) {} \
}; \
} \
__attribute__((constructor)) \
static void E2D_CONCAT(_e2d_reg_init_, ModuleClassName)() { \
static ::extra2d::detail::ModuleAutoRegister< ::extra2d::ModuleClassName> \
E2D_CONCAT(_e2d_auto_reg_, ModuleClassName)( \
#ModuleClassName, priorityValue, { __VA_ARGS__ });
#ModuleClassName, priorityValue, { __VA_ARGS__ }); \
}
/**
* @brief force_link

View File

@ -132,6 +132,14 @@ private:
*/
bool hasCircularDependency() const;
/**
* @brief
*
*
* createAndInitAll()
*/
void ensureCoreModulesRegistered();
std::vector<ModuleMetaBase*> metas_;
std::vector<std::unique_ptr<Module>> instances_;
std::unordered_map<std::string, Module*> instanceMap_;

View File

@ -1,6 +1,10 @@
#include <extra2d/core/module.h>
#include <extra2d/core/module_macros.h>
#include <extra2d/core/module_meta.h>
#include <extra2d/modules/config_module.h>
#include <extra2d/modules/input_module.h>
#include <extra2d/modules/render_module.h>
#include <extra2d/modules/window_module.h>
#include <extra2d/utils/logger.h>
#include <algorithm>
@ -26,6 +30,39 @@ void ModuleRegistry::registerMeta(ModuleMetaBase *meta) {
metas_.push_back(meta);
}
void ModuleRegistry::ensureCoreModulesRegistered() {
static bool s_coreModulesRegistered = false;
if (s_coreModulesRegistered) {
return;
}
s_coreModulesRegistered = true;
static ModuleMeta<ConfigModule> s_configMeta;
static ModuleMeta<WindowModule> s_windowMeta;
static ModuleMeta<InputModule> s_inputMeta;
static ModuleMeta<RenderModule> s_renderMeta;
s_configMeta.name_ = "ConfigModule";
s_configMeta.priority_ = 0;
s_configMeta.dependencies_ = {};
registerMeta(&s_configMeta);
s_windowMeta.name_ = "WindowModule";
s_windowMeta.priority_ = 20;
s_windowMeta.dependencies_ = {"ConfigModule"};
registerMeta(&s_windowMeta);
s_inputMeta.name_ = "InputModule";
s_inputMeta.priority_ = 30;
s_inputMeta.dependencies_ = {"WindowModule"};
registerMeta(&s_inputMeta);
s_renderMeta.name_ = "RenderModule";
s_renderMeta.priority_ = 40;
s_renderMeta.dependencies_ = {"WindowModule"};
registerMeta(&s_renderMeta);
}
std::vector<ModuleMetaBase *> ModuleRegistry::getAllMetas() const {
return metas_;
}
@ -177,8 +214,7 @@ bool ModuleRegistry::createAndInitAll() {
return true;
}
// 动态库中模块已通过 E2D_MODULE 宏自动注册
// 无需手动调用 registerCoreModules()
ensureCoreModulesRegistered();
E2D_LOG_INFO("ModuleRegistry: {} modules registered", metas_.size());
for (auto *meta : metas_) {

View File

@ -278,8 +278,14 @@ bool ShaderManager::loadBuiltinShaders() {
shaders_["builtin_" + name] = std::move(info);
loaded++;
E2D_LOG_DEBUG("Loaded builtin shader: {}", name);
} else {
E2D_LOG_WARN("Failed to create shader: {}", name);
}
} else {
E2D_LOG_WARN("Failed to parse shader: {} - {}", path, result.errorMessage);
}
} else {
E2D_LOG_WARN("Shader file not found: {}", path);
}
}

View File

@ -0,0 +1,2 @@
# Extra2D Shader Cache Index
# Format: name=hash