嵌入式八股文3 编译与调试

1.编译过程(预编译(展开宏定义,处理预编译指令生成.i文件),编译(把.c或.cpp编译汇编指令,生成.S文件),汇编(把汇编编译成二进制文件.o),链接(链接所有的.o文件和库文件,生成可执行文件)
2.编译器优化(编译器会自动优化一部分代码,比如提高性能,减少冗余的代码内容,去掉不需要执行的代码等,对gcc用-O来开启优化,一般有3个优化等级,-O0表示不优化)
3.gcc如何开启调试信息(编译时加上-g选项)
4.gdb操作(gdb a.out进入gdb模式,run运行程序,b打断点,s单步调试,n单步调试进入子函数,thread_info查看线程,bt查看堆栈信息,f进入具体的栈帧,disassemble查看反汇编)
5.linux如何查内存泄漏(valgrind等工具,或者自己加日志埋点)
6.linux如何查程序崩溃(打断点或者打印大法或者gdb在崩溃后查coredump文件,找到堆栈信息,查看停在哪里)
7.makefile和cmake(makefile是make用来编译的规则,但是由于跨平台性不足及编写难度偏大,于是有了cmake工具。语法较多不展开多说,本质上是先把Cmakelist.txt的文本内容通过cmake转为makefile,然后编译器再根makefile进行编译)
8.动态链接和静态链接(动态链接是把依赖库单独放在一边,可执行文件中只有符号表没有二进制内容,因此是在程序执行时再去找二进制内容。静态链接是把所有依赖打包整合到可执行文件。动态链接的可执行文件小,更新灵活,可移植强,但需要运行时去搜索,性能相对差一点。静态链接缺点是可执行文件占用空间大,编译慢,优点是运行速度快,不依赖环境)
9.C++的'extern C'的作用(让C++程序正确调用C代码,因为C++虽然兼容C语法,但编译器生成的函数符号是不一样的,可能导致链接出错或者执行时出现undefined reference等提示)
10.编译时undefined reference出现原因(包含了头文件并调用了某个函数,但该函数没有被实现,只有声明没有定义。一般来说可能是没有对函数体进行编写,或者没有把对应的.c文件加入到编译工程。其次也可能是虚函数没有得到重写,找不到虚表等)
11.C程序函数参数入栈顺序(从右到左依次入栈)
全部评论

相关推荐

不知道怎么取名字_:这种,我遇到过一次,筛选简历的人没注意,面试官拿到简历后一看,就觉得不用面试了
点赞 评论 收藏
分享
04-16 10:27
已编辑
美团_Saas_后端开发
今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,拿到美团offer那会感觉自己天都亮了。没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
2
17
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务