CentOS8编译旧C程序报struct cmd_type不完整元素类型错误求助
问题原因
C语言要求结构体类型的完整定义必须出现在该类型的变量、数组声明之前,本次报错是command.h头文件的代码顺序错误导致:
- 先执行了
extern const struct cmd_type cmd_table[];数组声明 struct cmd_type的完整结构定义写在了该声明之后,编译器处理到extern语句时无法得知struct cmd_type的内存布局,因此抛出“数组元素类型不完整”的错误。
解决方案
直接调整command.h的代码顺序,将struct cmd_type的定义移到extern数组声明之前即可,调整后的核心代码片段如下:
typedef int CHAT_CMD (request_rec *r, char *message_text); #define DECLARE_CHAT_CMD( cmd ) CHAT_CMD cmd // 先完成结构体定义 struct cmd_type { char *name; CHAT_CMD *cmd; int rank; int room; }; // 再声明外部数组 extern const struct cmd_type cmd_table[]; // 后续的命令函数声明保持原有顺序不变 DECLARE_CHAT_CMD(do_admin); DECLARE_CHAT_CMD(do_alink); // 其余DECLARE_CHAT_CMD宏定义无需修改
额外注意事项
你当前编译的是32位程序,CentOS 8默认未预装32位依赖库,后续链接阶段如果出现库找不到的报错,可以先安装对应32位依赖:
- 安装基础32位编译依赖:
dnf install glibc-devel.i686 libgcc.i686 - 安装32位MySQL客户端依赖:
dnf install mariadb-connector-c-devel.i686(CentOS 8默认使用mariadb替代MySQL,接口完全兼容mysqlclient)
内容的提问来源于stack exchange,提问作者Darren
相关产品推荐
相关产品推荐

