Makefile中使用-static-libstdc++时ld报无法识别`tic-libstdc++'选项怎么办
问题原因与修复方案
报错根因
-static-libstdc++ 是GCC/G++编译器前端的专属参数,不是原生ld链接器的支持参数。
你直接调用ld执行链接时,ld会对参数做短参数合并解析:
- 你输入的
-static-libstdc++会被ld拆分为-s、-t、-a tic-libstdc++三个部分 - 其中
-s(移除符号表)、-t(打印链接trace)都是ld的合法参数 - 剩余的
tic-libstdc++会被识别为-a参数的取值,而ld的-a参数根本没有tic-libstdc++这个选项,和你遇到的报错完全匹配。
修复方法
- 替换链接驱动:不要直接调用ld做链接,改用g命令来执行链接流程,g会自动把
-static-libstdc++转换为ld能识别的链接规则,同时自动引入静态版的libstdc++依赖。
修改后的链接命令参考:
g++ -z max-page-size=0x1000 -Ttext=0x01000000 -static -Bsymbolic -static-libstdc++ -o $(TARGET) $(OBJS) build/GDT/GDTASM.o
- 额外注意:fstream是用户态C++标准库组件,底层依赖操作系统的文件系统系统调用,内核环境没有对应的系统调用实现,就算链接成功也无法正常运行。如果需要在内核中读写文件,需要直接调用内核原生的文件操作接口,不要使用标准库的fstream。
内容的提问来源于stack exchange,提问作者user16636256
相关产品推荐
相关产品推荐

