编译Code::Blocks源码失败,请求排查是构建方式还是源码问题
在Debian Bullseye(Aarch64)编译Code::Blocks源码的编译错误排查
我在Linux Debian Bullseye(Aarch64架构)环境下尝试编译Code::Blocks源码,执行了以下命令:
export ACLOCAL_FLAGS="-I `wx-config --prefix`/share/aclocal" ./bootstrap ./configure
随后运行make命令时出现编译错误,具体错误信息如下:
sc_wxtypes.cpp: In function ‘void ScriptBindings::Register_wxTypes()’: sc_wxtypes.cpp:357:57: error: no matching function for call to ‘SqPlus::SQClassDef<wxFileName>::func(<unresolved overloaded function type>, const char [10])’ 357 | func(&wxFileName::Normalize, "Normalize"). | ^ In file included from ../../../../src/include/scripting/bindings/sc_base_types.h:27, from sc_wxtypes.cpp:18: ../../../../src/include/scripting/sqplus/sqplus.h:1759:16: note: candidate: ‘template<class Func> SqPlus::SQClassDef<TClassType>& SqPlus::SQClassDef<TClassType>::func(Func, const SQChar*) [with Func = Func; TClassType = wxFileName]’ 1759 | SQClassDef & func(Func pfunc,const SQChar * name_) { | ^~~~ ../../../../src/include/scripting/sqplus/sqplus.h:1759:16: note: template argument deduction/substitution failed: sc_wxtypes.cpp:357:57: note: couldn’t deduce template parameter ‘Func’ 357 | func(&wxFileName::Normalize, "Normalize"). | ^ sc_wxtypes.cpp:362:33: error: expected primary-expression before ‘>’ token 362 | func<WXFN_SETCWD>(&wxFileName::SetCwd, "SetCwd"). | ^ sc_wxtypes.cpp:362:35: error: left operand of comma operator cannot resolve address of overloaded function 362 | func<WXFN_SETCWD>(&wxFileName::SetCwd, "SetCwd"). | ^~~~~~~~~~~~~~~~~~~ sc_wxtypes.cpp:363:17: error: request for member ‘func’ in ‘((void)0, "SetCwd")’, which is of non-class type ‘const char [7]’ 363 | func(&wxFileName::SetExt, "SetExt"). | ^~~~ sc_wxtypes.cpp:368:42: error: expected primary-expression before ‘>’ token 368 | func<WXFN_ISFILEWRITEABLE>(&wxFileName::IsFileWritable,"IsFileWritable"); | ^ sc_wxtypes.cpp:368:44: error: left operand of comma operator cannot resolve address of overloaded function 368 | func<WXFN_ISFILEWRITEABLE>(&wxFileName::IsFileWritable,"IsFileWritable"); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ sc_wxtypes.cpp: At global scope: sc_wxtypes.cpp:432:2: fatal error: opening dependency file .deps/sc_wxtypes.Tpo: Permission denied 432 | }; | ^ compilation terminated.
请问这是构建方式的问题,还是源码本身存在错误?
问题分析与解决建议
这两类错误分别对应源码兼容性问题和构建权限问题,具体如下:
模板参数推导与重载函数匹配错误
前面的编译错误(比如no matching function for call to func、expected primary-expression before '>' token)属于源码层面的兼容性问题:wxFileName::Normalize、SetCwd等是重载函数,SqPlus的func模板无法自动推导正确的函数类型,导致模板参数匹配失败。- 代码中使用的
func<WXFN_SETCWD>这类写法可能存在语法或宏定义问题,编译器无法识别WXFN_SETCWD作为有效的模板参数类型,进而引发后续的语法错误。
这类问题通常是Code::Blocks源码在新编译器(Debian Bullseye默认的gcc版本较高)或Aarch64架构下的兼容性缺陷,需要修改绑定代码明确指定重载函数的类型。
权限错误
最后的fatal error: opening dependency file .deps/sc_wxtypes.Tpo: Permission denied是构建权限问题:- 编译过程中生成的
.deps目录或文件当前用户没有写入权限,可能是之前用root执行过make,导致文件所有权变更,或者目录权限设置不正确。
- 编译过程中生成的
解决步骤
修复权限问题:
执行以下命令修复编译目录的权限:sudo chown -R $USER:$USER . make clean之后重新运行
make,先排除权限问题的干扰。修复源码兼容性问题:
如果权限修复后仍出现模板匹配错误,需要修改sc_wxtypes.cpp中的绑定代码:- 对于重载函数,需要显式强制转换为目标函数类型,比如
static_cast<void (wxFileName::*)(wxPathFormat)>(&wxFileName::Normalize)(具体参数类型需要参考wxWidgets中Normalize的重载声明)。 - 检查
WXFN_SETCWD等宏的定义是否正确,确保它们是有效的函数指针类型别名,或者直接替换为明确的函数类型作为模板参数。
- 对于重载函数,需要显式强制转换为目标函数类型,比如
另外,也可以尝试使用Code::Blocks官方提供的针对Debian Bullseye的补丁,或者切换到更稳定的Code::Blocks版本(比如最新的稳定版),避免源码中的兼容性问题。
内容的提问来源于stack exchange,提问作者Gu-Goomba
相关产品推荐
相关产品推荐

