linux中编译得到的.o文件如何生成bin文件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux中编译得到的.o文件如何生成bin文件?相关的知识,希望对你有一定的参考价值。
RT,下载了uboot的源码,修改后用make得到了.o文件。具体说是一堆的.o文件。网上说下一步是链接这些o文件得到bin文件,最后烧录bin文件。那么bin文件是怎么得到的?。。
常见的笔记本故障大全笔记本电脑由于其结构的特殊性,决定了其维修的复杂性。但笔记本电脑终究是电脑的一种,它的维修原理与普通台式机是基本相同的。如果你是一位笔记本电脑用户,而且对它的维修方面的知识感兴趣,那么你可以参看本文,这里列举了一些解决笔记本电脑故障的分析处理过程,也许会使你得到一些帮助。
笔记本常见故障-开机不亮-硬件判断
---笔记本电脑主板Bios出现故障会引起开机不亮
---笔记本电脑CPU出现故障笔记本液晶屏无反应,也是开机不亮的原因。
--笔记本电脑信号输出端口出现故障会引起开机不亮
---笔记本电脑主板显卡控制芯片出现故障会引起开机不亮
---笔记本电脑显卡出现故障会引起开机不亮
---笔记本电脑内存出现故障会引起开机不亮
笔记本电池充不进电-硬件故障判断
---笔记本电脑电源适配器出现故障会引起电池充不进电
---笔记本电脑电池出现故障会引起电池充不进电。
---笔记本电脑主板电源控制芯片出现故障会引起电池充不进电
---笔记本电脑主板其它线路出现故障会引起电池充不进电
笔记本不认外设-硬件故障判断
---笔记本电脑相关外设硬件出现故障会引起笔记本不认外设
---笔记本电脑BIOS出现故障设置出错会引起笔记本不认外设。
---笔记本电脑主板外设相关接口出现故障会引起笔记本不认外设
---笔记本电脑主板出现故障也会引起笔记本不认外设没同时笔记本电脑不开机。
笔记本主板出现故障会引发如下现象特征
---笔记本电脑开机后不认笔记本硬盘。
---笔记本电脑开机后不认笔记本光驱。
---笔记本电脑电池不充电。
---笔记本电脑定时或不定时关机。
---笔记本电脑键盘不灵。
---笔记本电脑开机时有时会掉电。
---笔记本电脑定时死机
以上这些故障现象都与笔记本主板相关
笔记本电源适配器引起的故障现象
--笔记本电脑开机不亮。
---笔记本电脑间断性死机。
--笔记本电源适配器发热。
--笔记本电脑光驱读DVD或容易死机或掉电。
--笔记本电脑运行大行程序容易死机或掉电。
以上这些故障现象都与记本电源适配器相关
笔记本光驱介绍
笔记本光驱──机械驱动部分。
笔记本光驱──激光头组件。
笔记本光驱故障主要来自这两个部位(笔记本光驱)。
一、驱动机械部分主要由3个小电机为中心组成:碟片加载机构由控制进、出盒仓(加载)的电机组成,主要完成光盘进盒(加载)和出盒(卸载);激光头进给机构由进给电机驱动,完成激光头沿光盘的半径方向由内向外或由外向内平滑移动,以快速读取光盘数据;主轴旋转机构主要由主轴电机驱动完成光盘旋转,一般采用DD控制方式,即光盘的转轴就是主轴电机的转轴。
二、激光头组件各种光驱最重要也是最脆弱的部件,主要种类有单光束激光头、三(多)光束激光头、全息激光头等几类。它实际是一个整体,普通单光束激光头主要由半导体激光器、半透棱镜/准直透镜、光敏检测器和促动器等零部件构成
笔记本光驱常见故障解析
笔记本光驱最常见的故障是机械故障,其次才是电路方面故障,而且电路故障中由用户调整不当引起的故障要比元器件损坏的故障多得多,所以在拆解或维护光驱设备时不要随便调整笔记本光驱内部各种电位器
笔记本光驱常见故障主要有三类:操作故障、偶然性故障和必然性故障。
1、操作故障例如驱动出错或安装不正确造成在Windows或DOS中找不到笔记本光驱;笔记本光驱连接线或跳线错误使笔记本光驱不能使用;CD线没连接好无法听CD;笔记本光驱未正确放置在拖盘上造成光驱不读盘;光盘变形或脏污造成画面不清晰或停顿或马赛克现象严重;拆卸不当造成光驱内部各种连线断裂或松脱而引起故障等。
2、偶然性故障笔记本光驱随机发生的故障,如机内集成电路,电容,电阻,晶体管等元器件早期失效或突然性损坏,或一些运动频繁的机械零部件突然损坏,这类故障虽不多见,但必须经过维修及更换才能将故障排除,所以偶然性故障又被称为"真"故障。
3、必然性故障笔记本光驱在使用一段时间后必然发生的故障,主要有:激光二极管老化,读碟时间变长甚至不能读碟;激光头组件中光学镜头脏污/性能变差等,造成音频/视频失真或死机;机械传动机构因磨损、变形、松脱而引起故障。
需要说明的是必然性故障的维修率不仅取决于产品的质量,而且还取决于用户的人为操作和保养及使用频率与环境。
常见故障的判断
1、开机检测不到光驱先检查一下光驱跳线跳正确与否;然后检查光驱IDE接口是否插接不良,如没有,可将其重新插好、插紧;最后,有可能是数据线损坏
2、进出盒故障表现为不能进出盒或进出盒不顺畅,可能原因及排除方法是,进出盒仓电机插针接触不良或电机烧毁--可重插或更换;进出盒机械结构中的传动带(橡皮圈)松动打滑
3、激光头故障故障现象表现为挑盘(有的盘能读,有的盘不能读)或者读盘能力差。光驱使用时间长或常用它看VCD或听CD,激光头物镜变脏或老化。
★敬告大家千万不要使用市面上销售的一些低价劣质光头清洁盘,因为这些盘的刷毛太硬,反而会刮花物镜,并且还有可能引起静电危害,缩短光驱使用寿命。
4、激光信号通路故障指的是激光头与电路板之间的连接线,是激光头与其他电路信息交换的通道。此处产生故障较多。。
5、主轴信号通路故障一般情况下,主轴电机与其驱动电路是合二为一的,称为主轴信号通路,此电路也由一条与激光信号通路连线一样的连接线连接,只不过股数不一样罢了。由于它与激光头信息通路都是由伺服电路进行信息沟通的。因而,在故障现象上有许多相似的地方,但由于激光头信息通路在进出盒时,其连接线易被拉折而损坏,所以在遇到相同故障现象时应先考虑激光头信息通路故障,再考虑主轴信号通路故障。
笔记本键盘如果出现故障引起的故障现象
笔记本电脑使用的故障主要有开不了机。
笔记本在使用过程中时而出现死机。
笔记本键盘的某个键出现使用不灵。
硬件故障现象
一、不加电 (电源指示灯不亮)
1. 检查外接适配器是否与笔记本正确连接,外接适配器是否工作正常。
2. 如果只用电池为电源,检查电池型号是否为原配电池;电池是否充满电;电池安装的是否正确。
3. 检查DC板是否正常;
4. 检查、维修主板
二、电源指示灯亮但系统不运行,LCD也无显示
1. 按住电源开关并持续四秒钟来关闭电源,再重新启动检查是否启动正常。
2. 外接CRT显示器是否正常显示。
3. 检查内存是否插接牢靠。
4. 清除CMOS信息。
5. 尝试更换内存、CPU、充电板。
6. 维修主板
三、显示的图像不清晰
1. 检测调节显示亮度后是否正常。
2. 检查显示驱动安装是否正确;分辨率是否适合当前的LCD尺寸和型号。
3. 检查LCD连线与主板连接是否正确; 检查LCD连线与LCD连接是否正确。
4. 检查背光控制板工作是否正常。
5. 检查主板上的北桥芯片是否存在冷焊和虚焊现象。
6. 尝试更换主板。
四、无显示
1. 通过状态指示灯检查系统是否处于休眠状态,如果是休眠状态,按电源开关键唤醒。
2. 检查连接了外接显示器是否正常。
3. 检查是否加入电源。
4. 检查LCD连线两端连接正常。
5. 更换背光控制板或LCD。
6. 更换主板。
五、电池电量在Win98 / Win Me中识别不正常
1. 确认电源管理功能在操作系统中启动并且设置正确。
2. 将电池充电三小时后再使用。
3. 在Windows 98 或Windows Me中将电池充放电两次。
4. 更换电池。
六、触控板不工作
1. 检查是否有外置鼠标接入并用MOUSE测试程序检测是否正常。
2. 检查触控板连线是否连接正确。
3. 更换触控板
4. 检查键盘控制芯片是否存在冷焊和虚焊现象
5. 更换主板
七、串口设备不工作
1. 在BIOS设置中检查串口是否设置为“ENABLED”
2. 用SIO测试程序检测是否正常。
3. 检查串口设备是否连接正确。
4. 如果是串口鼠标,在BIOS设置检查是否关闭内置触控板;在Windows 98 或Me的设备管理器中检查是否识别到串口鼠标;检查串口鼠标驱动安装是否正确。
5. 更换串口设备。
6. 检查主板上的南桥芯片是否存在冷焊和虚焊现象。
7. 更换主板。
八、并口设备不工作
1. 在BIOS设置中检查并口是否设置为“ENABLED”。
2. 用PIO测试程序检测是否正常。
3. 检查所有的连接是否正确。
4. 检查外接设备是否开机。
5. 检查打印机模式设置是否正确。
6. 检查主板上的南桥芯片是否存在冷焊和虚焊现象。
7. 更换主板。
九、USB口不工作
1. 在BIOS设置中检查USB口是否设置为“ENABLED”。
2. 重新插拔USB设备, 检查连接是否正常。
3. 检查USB端口驱动和USB设备的驱动程序安装是否正确。
4. 更换USB设备或联系USB设备制造商获得技术支持。“ENABLED”
5. 更换主板。
十、声卡工作不正常
1. 用AUDIO检测程序检测是否正常。
2. 检查音量调节是否正确。
3. 检查声源(CD、磁带等)是否正常。
4. 检查声卡驱动是否安装。
5. 检查喇叭及麦克风连线是否正常。
6. 更换声卡板
7. 更换主板。
十一、风扇问题
1. 用FAN 测试程序检测是否正常,开机时风扇是否正常
2. FAN线是否插好?
3. FAN是否良好?
4. M/B部分的CONNECTER是否焊好?
5. 主板不良
十二、KB问题
1. 用KB测试程序测试判断
2. 键盘线是否插好?
3. M/B部分的CONNECTER是否有针歪或其它不良
4. 主板不良
软件故障的分类
十三、驱动程序类
1. 显示不正常;
2. 声卡不工作;
3. Modem,LAN不能工作
4. QSB不能使用
5. 某些硬件因没有加载驱动或驱动程序加载不正确而不能正常使用
十四、操作系统类
1. 操作系统速度变慢
2. 有时死机
3. 机型不支持某操作系统
4. 不能正常关机
5. 休眠死机
十五、应用程序类
1. 应用程序冲突导致系统死机
2. 应用程序导致不系统不能正常关机
3. 应用程序冲突导致不能正常使用
一.电池使用问题
1、新电池需要像手机一样充电12小时么?
虽然笔记本电脑的电路设计要比手机完善许多,但是为了让新电池能够以更好的状态投入工作,电池的激活和校准工作还是需要进行的,厂商通用的做法是新笔记本在第一次开机时电池应带有3%的电量,此时,应该先不使用外接电源,而是把电池里的余电用尽,直至关机,然后再用外接电源充电。然后还要把电池的电量用尽后再充,充电时间一定要超过12小时,反复做三次,以便激活电池。
2、为什么电池没用使用电量也减少了?
由于环境湿度和非绝对绝缘环境的影响,电池都存在自然消耗的现象,视电池的新旧程度和品质,3-4天会下降1%左右,所以只要不是大幅度的下降都属于正常现象。
3、使用电源需要把电池取下么?
一般笔记本电脑的充电设计都是在电量低于95%才会充电的,而且由于自然损耗的存在,所以对于电池的损耗,取下与不取下基本都是相同的,因此是否取下视习惯而定,如果取下建议将电池包裹在保鲜膜内并放置于干燥阴凉处,且记得1个月左右至少使用一次电池并充电,以避免电池失去活性。
4、电池没有完全用完就充电是否会减少寿命?
电池的寿命一般按照完全充电次数计算,Li电池一般为300-400次。当然你不必担心接通电源对电池进行一次充电,哪怕只有一点就会被计算一次,电池的充电次数一般只有当电量累计充至80-90%才会增加一次,所以不用担心。在此还要说下,笔记本电池通常用的是锂电池,所以要避免在高温环境下使用锂电池,专家研究,高温状态下会加速锂电池的老化过程,并且同样的不要在极端的低温环境下使用。低温环境会降低锂电池的活性,降低笔记本电池的寿命。定期为锂电池进行激活处理,就是完全充电和放电,让锂电池恢复最大容量。做法就是,关闭所有电源管理,让笔记本慢慢的放电直至完全没电,然后在完全充电,重复两到三次即可。炎热的天气里,尽可能的维护好自己的自己的笔记本电池,才能让笔记本电脑更好的发挥自身的作用。
二.笔记本散热问题
目前笔记本散热一般都采用的散热管散热、键盘对流散热、温控风扇三级散热方式。个人认为技术比较先进的还是IBM和东芝,虽然东芝的本本不被很多人看好。
1、为什么风扇在开机的时候转一下就再也不转了?
由于笔记本电脑的温控设计,所以开机风扇自检后就会停止旋转,只有当机内达到一定温度时才会加速旋转,这也是为什么当你进行高负荷工作,诸如播放高解码率视频,3D游戏等时风扇高速旋转的原因。
2. 使用笔记本应注意周围环境吗?
使用笔记本的时候,要注意周围环境的整洁,通常笔记本最理想的工作温度是在10℃~35℃,且湿度不要太大。尤其在炎热的夏季,要保持周围环境的通风良好, 尽量在空调间里使用笔记本。电脑外壳上的凹槽和开口是用来通风的。为了确保电脑能可靠的工作并防止过热,请勿阻塞或遮盖这些开口。请勿将电脑摆放在腿上、床上或者沙发上,这些都是不可取的,柔软的东西都将笔记本底部的散热孔堵住,使得笔记本的热量无法顺利导出从而出现故障。可以在机器的底部从后端垫些书本之类的东西(偶用的是红茶的瓶子盖),让笔记本的底面与桌面保持一些空间,笔记本的底部就不会紧贴在桌面上。这样会有更多的热量从底部散发出去,或者你也可以加一个散热的底座来加大笔记本底部风流速度。市场上还出现了一些散热的外置装备,类似于U盘之类的或者内置的散热模块,不过偶还没有用过。
3. 关闭笔记本:
当你完成了工作,关闭笔记本,尽量让你的笔记本好好休息。
不要让你的笔记本开着的时候放在包包里
。经常清洁通风口,笔记本内置的风扇都有一个通风口。过了一段时间,通风口就会积聚着灰尘,这些灰尘会堵塞通风口。
同时必要的时候你可以用诊断工具测试笔记本的风扇是否工作正常。如果有专门的工具,你也可以打开风扇的地方,清除灰尘。
4. 升级笔记本的BIOS:
有时候,发热意味着计算机风扇的控制器需要BIOS升级。新版本的BIOS可以使得笔记本风扇工作得更有效率。如果你觉得你的笔记本变得越来越热,你不妨到网站上查看是否有新的BIOS提供。
笔记本的散热至今还没有很完美的,随着功能的强大,产热量会越大,这样的也给散热系统带来了压力,一般的笔记本问题用专业软件检测,像现在的这个天气(室温在30度左右)CPU和硬盘的温度大约在60度以上也属于正常。
三.屏幕问题
1.亮点和坏点
所谓坏点,是指LCD液晶显示器屏幕上无法控制的恒亮或恒暗的点。坏点的造成是LCD面板生产时因各种因素造成的瑕疵,如可能是某些细小微粒落在面板里面,也可能是静电伤害破坏面板,还有可能是制程控制不良等等。
坏点分为两种:亮点与暗点。亮点就是在任何画面下恒亮的点,切换到黑色画面就可以发现;暗点就是在任何画面下恒暗的点,切换到白色画面就可以发现。一般刚买回来的笔记本或者在买的时候,用软件检测下屏幕的亮点或者坏点,一般根据品牌不同,对这个的标准不同德,一般不能多于三个。检测软件用MonitorTest就可以了。同时,平时要减少屏幕在日光下暴晒的可能,白天使用,尽量拉上窗帘,以防屏幕受日照后,温度过高会加快老化
2.如何擦屏幕
如果仅仅是灰尘,那么可以先用气吹将灰尘尽量吹去,然后再用湿润的软布擦拭,软布要拧干,否则水可能会顺着屏幕表面流入高压包中造成屏幕损坏。如果是油污或者较难去除的污渍可以购买液晶屏幕专用清洁剂清除,切记不要使用没有质量保障的清洁剂,否则其中的醇类等腐蚀性化学成分会对屏幕造成损伤。中关村一般卖笔记本带的是亮洁的清洁套装,用这个就可以。切忌:勿用手或者硬东西擦拭屏幕。
3是否要贴膜?
本人不建议贴膜,虽说屏幕膜会对它起一个保护作用,但是这个位置一般是伤不到的,贴膜本身的成分会对屏幕有一定得伤害,还会影响散热。
4.有时候使用电池的时候屏幕会发出吱吱的声音
一般最新的笔记本没有这个问题了,老些的电脑或者质量部好的会有这个问题,就这个问题需要从两方面来解释:其一,在电池供电的时候,由于笔记本电脑节能特性的作用,整个笔记本电路的电压是在不断的变化的,这时通过屏幕高压包中的通电线圈的电流是处在不断的变化中的,而这个时候高压线圈发出的变频声也是中学物理知识所涉及的。如果笔记本电脑的电磁屏蔽较差,这种声音就会被用户听到,因此我们说这种现象在一些技术功底较弱的品牌的笔记本电脑中较为常见,实际很多朋友反应电源适配器会发生声音也是这个原因造成的。其二,这种声音也可能是高频噪音,这种声音和其一所述的声音最大的不同是高频噪音是一种会令人抓狂的声音,相信听过这种声音的朋友都会有所体会。一般这种声音属于主板设计缺陷,如果情况比较普遍,厂商都会发布解决此问题的BIOS更新文件,比如近期的IBM T40、HP NC6000都不同程度存在这个问题,厂商也已经发布了新的BIOS以供解决。
2012-7-24 10:54:01s纺0774764163xuufbepgmg0645611571z洙aひ邾r—邰农z洙r—邰农hku摔tq 参考技术A 不清楚,不过我们是买这个产品的
C++ 常用命令行开发工具(Linux)
1、简介
编译的四个阶段:预处理(扩展各个宏与文件)、编译(得到汇编代码)、汇编(得到机器码)、链接(得到可执行文件)
预处理:编译处理宏定义等宏命令(eg:#define)——生成后缀为“.i”的文件
编译:将预处理后的文件转换成汇编语言——生成后缀为“.s”的文件
汇编:由汇编生成的文件翻译为二进制目标文件——生成后缀为“.o”的文件
连接:多个目标文件(二进制)结合库函数等综合成的能直接独立执行的执行文件——生成后缀为“.out”的文件
2、gcc / g++
实际使用中我们更习惯使用 gcc 指令编译 C 语言程序,用 g++ 指令编译 C++ 代码。需要强调的一点是,这并不是 gcc 和 g++ 的区别,gcc 指令也可以用来编译 C++ 程序,同样 g++ 指令也可以用于编译 C 语言程序。
GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器。
当然,gcc 指令也为用户提供了“手动指定代表编译方式”的接口,即使用 -x 选项。例如,gcc -xc xxx 表示以编译 C 语言代码的方式编译 xxx 文件;而 gcc -xc++ xxx 则表示以编译 C++ 代码的方式编译 xxx 文件。
但如果使用 g++ 指令,则无论目标文件的后缀名是什么,该指令都一律按照编译 C++ 代码的方式编译该文件。也就是说,对于 .c 文件来说,gcc 指令以 C 语言代码对待,而 g++ 指令会以 C++ 代码对待。但对于 .cpp 文件来说,gcc 和 g++ 都会以 C++ 代码的方式编译。
gcc -v
g++ -v
# gcc 编译c代码
gcc demo.c
gcc main.c func.c -o app.out
# gcc 编译c++代码
gcc -xc++ -lstdc++ -shared-libgcc demo.cpp
gcc -xc++ -lstdc++ -shared-libgcc demo.cpp -o democpp.exe
# g++ 编译c++代码
g++ demo.cpp
g++ demo.cpp -o democpp.exe
<font color=blue>首先说明:gcc 和 GCC 是两个不同的东西
GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
gcc是GCC中的GUN C Compiler(C 编译器)
g++是GCC中的GUN C++ Compiler(C++编译器)
gcc 命令的常用选项:
选项 | 解释 |
---|---|
-ansi | 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。 |
-c | 只编译并生成目标文件。 |
-DMACRO | 以字符串"1"定义 MACRO 宏。 |
-DMACRO=DEFN | 以字符串"DEFN"定义 MACRO 宏。 |
-E | 只运行 C 预编译器。 |
-g | 生成调试信息。GNU 调试器可利用该信息。 |
-IDIRECTORY | 指定额外的头文件搜索路径DIRECTORY。 |
-LDIRECTORY | 指定额外的函数库搜索路径DIRECTORY。 |
-lLIBRARY | 连接时搜索指定的函数库LIBRARY。 |
-m486 | 针对 486 进行代码优化。 |
-o FILE | 生成指定的输出文件。用在生成可执行文件时。 |
-O0 | 不进行优化处理。 |
-O 或 -O1 | 优化生成代码。 |
-O2 | 进一步优化。 |
-O3 | 比 -O2 更进一步优化,包括 inline 函数。 |
-shared | 生成共享目标文件。通常用在建立共享库时。 |
-static | 禁止使用共享连接。 |
-UMACRO | 取消对 MACRO 宏的定义。 |
-w | 不生成任何警告信息。 |
-Wall | 生成所有警告信息。 |
2.1 system(执行shell 命令)
头文件:
#include<stdlib.h>
定义函数:
int system(const char * string);
函数说明:
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。
test_sys.c:
#include<stdlib.h>
#include<stdio.h>
int
main(int argc, char *argv[])
system("ls -al /etc/docker /etc/nginx /etc/firefox");
return 0;
gcc test_sys.c -o test.exe
./test.exe
2.2 popen(建立管道I/O)
头文件
#include<stdio.h>
定义函数
FILE * popen( const char * command,const char * type);
函数说明
popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c 来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。
test_popen.c:
#include<stdio.h>
main()
FILE* fp;
char buffer[80];
fp=popen("cat /etc/nginx", "r");
fgets(buffer,sizeof(buffer),fp);
printf("%s", buffer);
pclose(fp);
gcc test_popen.c -o test.out
./test.out
2.3 vfork+exec(新建子进程)
使用vfork()新建子进程,然后调用exec函数族。 test_vfork.c:
#include<unistd.h>
#include<stdio.h>
main()
char * argv[]="ls", "-al", "/etc/firefox", (char*)0 ;
if(vfork() == 0)
execv("/bin/ls", argv);
else
printf("it is the parent process\\n");
gcc test_vfork.c -o test.out
./test.out
3、clang
Clang是一个C语言、C++、Objective-C语言的轻量级编译器。源代码发布于BSD协议下。Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。
Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。它与GNU C语言规范几乎完全兼容(当然,也有部分不兼容的内容,包括编译命令选项也会有点差异),并在此基础上增加了额外的语法特性,比如C函数重载(通过__attribute__((overloadable))来修饰函数),其目标(之一)就是超越GCC。 win10 的 msvc,Ubuntu 的 gcc 和 clang gcc 是c的编译器,g++是c++的编译器。
3.1 下载和安装clang
# yum install epel-release
yum install clang
检查是否安装成功(查看clang版本,有显示即为成功):
clang --version
clang -v
3.2 clang和gcc比较
3.2.1 gcc
GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发布的自由软件,也是GNU项目的关键部分,亦是自由的类Unix及苹果电脑Mac OS X 操作系统的标准编译器。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。
GCC原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,以及Go与其他语言。
原本用C开发,后来因为LLVM、Clang的崛起,令GCC更快将开发语言转换为C++。许多C的爱好者在对C++一知半解的情况下主观认定C++的性能一定会输给C,但是Taylor给出了不同的意见,并表明C++不但性能不输给C,而且能设计出更好,更容易维护的程序。
3.2.2 clang
Clang(发音为/ˈklæŋ/类似英文单字clang) 是一个C、C++、Objective-C和Objective-C++编程语言的编译器前端。它采用了底层虚拟机(LLVM)作为其后端。它的目标是提供一个GNU编译器套装(GCC)的替代品。作者是克里斯·拉特纳,在苹果公司的赞助支持下进行开发,而源代码授权是使用类BSD的伊利诺伊大学厄巴纳-香槟分校开源码许可。
Clang项目包括Clang前端和Clang静态分析器等。
3.2.3 LLVM
“ LLVM , 它是一个 编译器 的基础建设,以 C++ 写成。它是为了任意一种编程语言写成的程序,利用 虚拟技术 ,创造出 编译时期 , 链结时期 , 运行时期 以及“闲置时期”的优化。
因为GCC的编译器已经慢慢无法满足苹果的需求,因此,苹果开发了Clang与LLVM来完全取代GCC,Xcode4之后,苹果的默认编译器已经是LLVM了。Clang作为编译器前端,LLVM作为编译器后端。
4、make
Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。
make --version
make -v
–f :指定作为makefile的文件的名称。 如果不用该选项,那么make程序首先在当前目录查找名为makefile的文件,如果没有找到,它就会转而查找名为Makefile的文件。如果您在Linux下使用GNU Make的话,它会首先查找GNUmakefile,之后再搜索makefile和Makefile。按照惯例,许多Linux程序员使用Makefile,因为这样能使Makefile出现在目录中所有以小写字母命名的文件的前面。
4.1 例子1
- Makefile文件内容如下:
all:
gcc -Wall test.c -o test.out
执行命令如下:
make
# or
make all
- Makefile文件内容如下:
all:
gcc -c -Wall test.c
gcc -Wall test.o -o test.out
执行命令如下:
make
- Makefile文件内容如下:
all:
gcc -c -Wall test.c
gcc -c -Wall anotherTest.c
gcc -Wall test.o anotherTest.o -o test.out
执行命令如下:
make
4.2 例子2
- Makefile文件内容如下:
all: test
test: test.o anotherTest.o
gcc -Wall test.o anotherTest.o -o test.out
test.o: test.c
gcc -c -Wall test.c
anotherTest.o: anotherTest.c
gcc -c -Wall anotherTest.c
clean:
rm -rf *.o test.out
执行命令如下:
make all
make test
make clean
通过 -B 选项让所有目标总是重新建立:
make -B
使用 -d 选项打印调试信息:
make -d | more
使用 -C 选项改变目录: 你可以为 make 命令提供不同的目录路径,在寻找 Makefile 之前会切换目录的。 但是你想运行的 make 命令的 Makefile 文件保存在 ../make-dir/ 目录下,你可以这样做:
make -C ../make-dir/
通过 -f 选项将其它文件看作 Makefile:
make -f my_makefile
4.3 问题汇总
可能出现的问题如下: <font color=red>“Makefile:1: *** 遗漏分隔符 。 停止。”?
5、cmake
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。
5.1 下载cmake
ubuntu系统下只需要如下一句命令即可:
# ubuntu
sudo apt install cmake
CMake 提供了多种版本,包括但不限于 “RC 版本”(Release Candidate)和“稳定版本”(Latest Release)。切换到系统存放源代码的目录,再用 curl 命令通过该链接将 CMake 的二进制分发压缩包下载下来:
cd /usr/local/src
curl -LO https://github.com/Kitware/CMake/releases/download/v3.22.2/cmake-3.22.2-linux-x86_64.tar.gz
# or
yum install -y wget
wget -c https://github.com/Kitware/CMake/releases/download/v3.22.2/cmake-3.22.2-linux-x86_64.tar.gz
# wget -c https://cmake.org/files/v3.26/cmake-3.26.0-rc1-linux-x86_64.tar.gz
5.2 安装cmake
CMake 二进制分发压缩包下载完毕后,运行以下两条命令将压缩包解压缩,并将得到的文件夹移动到系统的本地程序目录,同时将文件夹重命名为 cmake(即 /usr/local/cmake):
tar -xvf cmake-3.26.0-rc1-linux-x86_64.tar.gz
# tar zxvf cmake-3.22.2-linux-x86_64.tar.gz
mv cmake-3.26.0-rc1-linux-x86_64 /usr/local/cmake
查看安装后的路径:
ls /usr/local/cmake
如果你是第一次按照本文步骤安装 CMake,为方便之后运行 CMake 的相关命令,请运行以下两条命令将 CMake 的可执行文件目录添加到系统环境变量 PATH 中:
echo export PATH="/usr/local/cmake/bin:$PATH" >> ~/.bashrc
source ~/.bashrc
查看~/.bashrc:
vi ~/.bashrc
#在最后添加export PATH=/usr/local/cmake/bin:$PATH
查看cmake的版本:
cmake --verison
6、gdb
GDB是一个强大的命令行调试工具。虽然X Window提供了GDB的图形版DDD,但是我仍然更钟爱在命令行模式下使用GDB。
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
gdb
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:
gcc -g hello.c -o hello
g++ -g hello.cpp -o hello
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
# 在进入函数func时,设置一个断点。可以敲入break func,或是直接就是b func
gdb
b main
7、git
Git --- The stupid content tracker, 傻瓜内容跟踪器。Linus Torvalds 是这样给我们介绍 Git 的。 Git 是用于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。
并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。
7.1 下载和安装git
Git是目前流行的非常好用的版本控制工具,这里介绍两种安装方式,1、yum安装,2、从github上下载最新的源码编译后安装。
在Linux上是有yum安装Git,非常简单,只需要一行命令:
yum -y install git
输入 git --version查看Git是否安装完成以及查看其版本号:
git --version
当然我们也可以从GitHub上下载最新的源码编译后安装。
# 需要删除旧的Git
yum -y remove git
# 下载,https://github.com/git/git/releases
wget https://github.com/git/git/archive/refs/tags/v2.39.1.tar.gz
# 进入/usr/local 目录解压git文件
tar -zxvf v2.39.1.tar.gz
# 安装编译所需要的依赖。
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
# 编译git源码,进入cd /usr/local/git-2.39.1 目录
make prefix=/usr/local/git all
# 安装git至/usr/bin/git路径
make prefix=/usr/local/git install
# 配置环境变量
vi /etc/profile
# 在底部加上如下
export PATH=$PATH:/usr/bin/git/bin
# 刷新环境变量
source /etc/profile
# 查看Git是否安装完成
git --version
7.2 使用git
命令 | 功能 |
---|---|
git init | 在本地的当前目录里初始化git仓库 |
git status | 查看当前仓库的状态 |
git add -A | 增加目录中所有的文件到缓存区 |
git add file | 增加相应文件到缓存区 |
git commit -m "信息" | 将缓存区中更改提交到本地仓库 |
git log | 查看当前版本之前的提交记录 |
git reflog | 查看HEAD的变更记录,包括回退 |
git branch -b branch_name | 建立一个新的分支 |
git diff | 查看当前文件与缓存区文件的差异 |
git checkout -- file | 取消更改,将缓存区的文件提取覆盖当前文件 |
git reset --hard 版本号 | 回退到相应版本号,同样也可以回退到未来的版本号 |
git clean -xf | 删除当前目录中所有未追踪的文件 |
git config --global core.quotepath false | 处理中文文件名 |
常用命令如下:
git remote add origin git@github.com:<用户名>/<仓库名>.git
git pull origin master //因为github建立仓库时会有readme.md文件,先要拷贝一份
git push -u origin master //将本地仓库链接到master分支上,你当然可以链接到其他分支
git push //上传你的本地仓库
8、bash
Bash Shell脚本是用Bash编写的计算机程序,它是一个包含了自定义数量命令的纯文本文件,用于在Linux系统上自动循环执行重复性任务。
8.1 Centos bash: 运行 ./xxx.sh: 权限不够
编写脚本xxx.sh:
#! /bin/bash
echo hello world;
chmod 777 ./xxx.sh
# chmod u+x test.sh
./xxx.sh
或者
chmod +x ./xxx.sh
或者
# 该方式不需要在第一行指定解释器信息
/bin/sh xxx.sh
# or
sh xxx.sh
sh /root/test.sh
8.2 Linux中解决cannot access ‘\\r’: No such file or directory
碰到这种情况,是因为脚本文件在windows环境下编辑过后再上传到linux服务器导致换行符格式不对。使用dos2unix命令行即可解决。 Ubuntu系统打开Windows下生成的文本文件,会在每行的末尾出现’^M’ 原因就是Windows和Linux的回车符是不同的。
在Windows下回车符是\\r\\n回车换行
在Linux下回车符是\\n
最简单、最常用的解决方法是使用dos2unix命令转换:
## ubuntu
apt-get install dos2unix
# or
apt-get install tofrodos
## centos
#进入root用户后,使用
yum install dos2unix。
dos2unix命令 用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter)。DOS下的文本文件是以\\r\\n作为断行标志的,表示成十六进制就是0D 0A。而Unix下的文本文件是以\\n作为断行标志的,表示成十六进制就是0A。DOS格式的文本文件在Linux底下,用较低版本的vi打开时行尾会显示^M,而且很多命令都无法很好的处理这种格式的文件,如果是个shell脚本,。而Unix格式的文本文件在Windows下用Notepad打开时会拼在一起显示。因此产生了两种格式文件相互转换的需求,对应的将UNIX格式文本文件转成成DOS格式的是unix2dos命令。
dos2unix [-hkqV] [-c convmode] [-o file ...] [-n infile outfile ...]
-k:保持输出文件的日期不变
-q:安静模式,不提示任何警告信息。
-V:查看版本
-c:转换模式,模式有:ASCII, 7bit, ISO, Mac, 默认是:ASCII。
-o:写入到源文件
-n:写入到新文件
# 最简单的用法就是dos2unix直接跟上文件名
dos2unix file
# 如果一次转换多个文件
dos2unix file1 file2 file3
dos2unix -o file1 file2 file3
# 如果想把转换的结果保存在别的文件
dos2unix -n oldfile newfile
# 如果要保持文件时间戳不变
dos2unix -k file
dos2unix -k file1 file2 file3
dos2unix -k -o file1 file2 file3
dos2unix -k -n oldfile newfile
# 转换当前目录下所有文件
find -type f | xargs dos2unix
也可以使用*通配符来同时修改多个,或者使用空格隔开文件名的方式。
8.3 readelf查看可执行文件信息
readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(.so)或者静态库(.a) 等包含ELF格式的文件。以下命令的使用是基于android编译出来的so文件上面去运行。
- 选项 -h(elf header),显示elf文件开始的文件头信息。
readelf -h ./test007.out
- 选项 -l(program headers),segments 显示程序头(段头)信息(如果有数据的话)。
readelf -l ./test007.out
- 选项 -S(section headers),sections 显示节头信息(如果有数据的话)。
readelf -S ./test007.out
- 选项 -s,symbols 显示符号表段中的项
readelf -s ./test007.out
- 选项 -r,relocs 显示可重定位段的信息。
readelf -r ./test007.out
- 选项 -d,dynamic 显示动态段的信息。
readelf -d ./test007.out
- 选项 -A,arch-specific 显示CPU构架信息。
readelf -A ./test007.out
- 选项 -a,all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I。
readelf -a ./test007.out
- 选项 -H,help 显示readelf所支持的命令行选项。
readelf -H ./test007.out
- 选项 -V,version-info 显示版本段的信息。
readelf -V ./test007.out
8.4 常见Shell的种类
Linux Shell的种类很多,用户可以通过查看/etc/shells文件中的内容来查看自己主机中当前有哪些种类的Shell。
cat /etc/shells
<font color=green>Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言。
<font color=blue>shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。
<font color=pink>shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中的其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。
<font color=purple>Linux中的shell有多种类型,常见的有Bourne Again Shell (简称bash)、Bourne Shell(简称sh)、C-Shelll(简称csh)、Korn Shell(简称ksh)。
<font color=grey>sh是Unix最初使用的shell,并且在每种Unix上都可以使用。sh在shell编程方面相当优秀,但在处理与用户的交互方面做得不如csh和ksh。Linux默认的shell是bourne again shell(bash),它与sh完全向后兼容。bash放在bin/bash中。sh和bash都是Linux上的默认shell,而bash是sh的升级版。
结语
如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;
╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地
//(ㄒoㄒ)//,就在评论处留言,作者继续改进;
o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!
以上是关于linux中编译得到的.o文件如何生成bin文件?的主要内容,如果未能解决你的问题,请参考以下文章