From 3bdbf60dbbc7db8029395fcceba8008d5c23a560 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 9 Sep 2025 11:31:17 +0000 Subject: [PATCH 1/2] Initial commit of modified files from installation Co-authored-by: zhang.lyuan --- cpputest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpputest b/cpputest index 40d62a2..e332d88 160000 --- a/cpputest +++ b/cpputest @@ -1 +1 @@ -Subproject commit 40d62a2cec9fbf5626ea90f3afbe451ceb6dac8c +Subproject commit e332d88164090beba1060bd3159aea5ded3f5bba From 988ec198a276fd364275e2a6fb77db1755c75431 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 9 Sep 2025 11:33:46 +0000 Subject: [PATCH 2/2] Fix: Resolve multiple definition of shutdown_server Co-authored-by: zhang.lyuan --- .cursorrules | 30 ++++++++++++++++++++++++++++++ src/html_ui/html_game.c | 2 ++ src/html_ui/html_game.h | 2 +- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 .cursorrules diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..cedf2bb --- /dev/null +++ b/.cursorrules @@ -0,0 +1,30 @@ +# 项目经验教训和规则 + +## C语言项目编译问题修复经验 + +### 问题:全局变量在头文件中的多重定义错误 +- **错误症状**: `multiple definition of 'shutdown_server'` 链接错误 +- **原因**: 在头文件(.h)中直接定义了全局变量,导致每个包含该头文件的源文件都创建了一个该变量的定义 +- **解决方案**: + 1. 在头文件中使用`extern`关键字声明变量:`extern void (*shutdown_server)(void);` + 2. 在具体的.c文件中提供实际定义:`void (*shutdown_server)(void);` +- **日期**: 完成于本次修复会话 +- **适用场景**: 所有C/C++项目中的全局变量声明和定义 + +### CppUTest框架使用经验 +- 项目使用CppUTest框架进行单元测试 +- 构建系统通过MakefileWorker.mk管理测试编译 +- 测试自动在编译成功后运行 +- 当前测试状态:50个测试,47个运行成功,3个忽略 + +### 项目构建流程 +1. 首先需要确保cpputest库已构建(检查cpputest/lib/目录) +2. 清理旧的编译文件:`make clean` +3. 重新编译:`make` +4. 测试会在编译成功后自动运行 + +### 下次遇到类似问题的处理步骤 +1. 识别链接器错误类型(多重定义 vs 未定义引用) +2. 对于多重定义:检查头文件中是否有不当的全局变量定义 +3. 对于未定义引用:检查是否缺少实现或库依赖 +4. 修复后重新清理并编译测试 \ No newline at end of file diff --git a/src/html_ui/html_game.c b/src/html_ui/html_game.c index f3239ba..1a7b433 100644 --- a/src/html_ui/html_game.c +++ b/src/html_ui/html_game.c @@ -7,6 +7,8 @@ #include "agent.h" #include "ui_agent.h" +void (*shutdown_server)(void); + static int ui_adaptor_pool_add_ui_adaptor(agent_t * ui); static agent_t * ui_adaptor_pool_get_ui_adaptor_by_id(int id); static void ui_adaptor_pool_remove(int id); diff --git a/src/html_ui/html_game.h b/src/html_ui/html_game.h index eb105ca..ac135c0 100644 --- a/src/html_ui/html_game.h +++ b/src/html_ui/html_game.h @@ -9,6 +9,6 @@ #define HTML_GAME_H_ int execute_game_command(const char * command, const char *parameters, char * buffer, int buffer_size); -void (*shutdown_server)(void); +extern void (*shutdown_server)(void); #endif /* HTML_GAME_H_ */