Makefile出现Missing Parenthesis Stopped Error与Missing Brace Stopped Error的解决方法
解决Makefile执行时的Missing Parenthesis/Brace Stopped Error错误
兄弟,我看你在编译自定义内核的Makefile时碰到了这两个括号相关的错误,先仔细捋一捋问题所在——你的Makefile代码本身语法看起来没啥问题,大概率是链接脚本linker.ld里出了语法错误,因为Makefile执行时调用ld链接器处理linker.ld,这时候如果链接脚本里有未闭合的括号(())或者大括号({}),就会抛出这类错误。
下面是具体的排查和解决步骤:
第一步:重点检查
linker.ld的语法
链接脚本(ld script)对括号/大括号的闭合要求非常严格,比如定义内存段的标准写法是:SECTIONS { .text 0x100000 : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } }你要逐行核对:
- 所有打开的
{都有对应的闭合},没有遗漏 - 所有使用
(的地方(比如表达式、符号引用)都有对应的) - 有没有不小心输入了中文的括号/大括号(非ASCII字符会被
ld识别为无效符号,也会触发类似错误)
- 所有打开的
第二步:确认Makefile本身的语法细节(虽然你的代码看起来没问题,但还是扫一遍)
- 确保所有变量引用都是
$(变量名)的格式,没有遗漏闭合的)——你的代码里$(GPPPARAMS)、$(ASPARAMS)这些写法都是正确的 - 检查规则里的命令行缩进:必须用Tab键缩进,不能用空格(不过这个错误通常会提示
missing separator,不是括号类错误,但还是确认下更稳妥)
- 确保所有变量引用都是
第三步:分步执行命令定位错误
如果不确定是哪一步出的问题,可以手动执行Makefile里的命令,一步步排查:- 先编译C++文件:
g++ -m32 -o kernel.o -c kernel.cpp,看是否报错 - 编译汇编文件:
as --32 -o loader.o loader.s,看是否报错 - 手动执行链接命令:
ld -melf_i386 -T linker.ld -o mykernel.bin loader.o kernel.o——如果这一步抛出括号错误,那百分百是linker.ld的问题
- 先编译C++文件:
如果你的linker.ld确实存在括号/大括号未闭合的问题,补上之后再执行make应该就能解决这两个错误了。
内容的提问来源于stack exchange,提问作者Mehmet1
相关产品推荐
相关产品推荐

