wxss 文件编译错误_Nachos实验Lab0,记录出现的一次错误

实验要求

  1. 在提供的虚拟机中编译Nachos3.4
  2. 通过Makefile熟悉项目结构
  3. 尝试添加一个源文件,并且成功编译

记录第3步,添加文件时出现的问题。

尝试在thread/文件夹中添加一个test.htest.cc文件。内容如下:

 // test.h
 #ifndef TEST_H
 ​
 #define TEST_H
 ​
 int add(int, int);
 ​
 int test_h;
 ​
 #endif
 // test.cc
 #include "test.h"
 ​
 int add(int a, int b)
 {
     return a + b;
 }

main.cc中修改,包含该文件,并且调用add方法。

 // main.cc
 //...
 #include "test.h"
 //...
 // line 82-84
 int main(int argc, char **argv)
 {
     printf("int main add(1,2)=%dn", add(test_h, test_h));
     ...
 }

修改对应的Makefile文件,分别是thread/MakefileMakefile.common文件。

thread/Makefile文件中添加main.o的依赖项。

 main.o: ...# 已省略
     ../threads/test.h

对应的,在Makefile.common文件中THREAD相关的部分添加test.htest.cc

 # Makefile.common
 THREAD_H =../threads/copyright.h
     ...
     ../threads/test.h
     ..。
 ​
 THREAD_C =../threads/main.cc
     ...
     ../threads/thread.cc
     ...
 ​
 THREAD_O =main.o list.o scheduler.o synch.o synchlist.o system.o thread.o 
     utility.o threadtest.o interrupt.o stats.o sysdep.o timer.o test.o

编译:

 vagrant@precise32:/vagrant/nachos/nachos-3.4/code$ make

可是出现了报错:

5f271a6194158a5e7f459ac03314d24e.png

出错阶段为ld链接阶段,错误信息为test_h出现了重复定义multiple definition,可是实际上只定义了一次,这是为什么呢?

原来在编译期间,main.cctest.cc均被编译成为了*.o文件,test_h的定义就保存在其中了。因此在链接阶段,就出现了重复定义错误。

解决办法:

test.h中将test_h声明为全局extern,具体定义在test.cc中完成,这样就可以确保test_h这个名称的唯一性了。

 // test.h
 #ifndef TEST_H
 ​
 #define TEST_H
 ​
 int add(int, int);
 ​
 extern int test_h;
 ​
 #endif
 #include "test.h"
 ​
 int test_h = 10;
 ​
 int add(int a, int b)
 {
     return a + b;
 }

再次编译项目,可以看到编译成功,运行nachos文件,也能得到预期效果。

 vagrant@precise32:/vagrant/nachos/nachos-3.4/code$ make

aaa49a55113e9116c0b345c35941d048.png

bac3282f35030573a84021bceb0c79ba.png

总结

C语言中编译单个文件和编译整个项目的许多概念是非常不同的,首先是使用了Makefile来管理和组织文件,这样每次添加或删除源文件,都需要在Makefile中做出相应的修改,才能保证整个项目的正确编译。

其次还有变量名占用,条件编译等注意事项,这次遇到的问题也让我了解了extern关键字的用法,对C项目编译链接等过程有了更深的认识。突然想到最开始学习编程和C语言时听到的一句话,感谢每一次编译器给出的错误信息,那都是学习和提高的好机会!

参考资料

https://blog.csdn.net/mantis_1984/article/details/53571758

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值