Круглозвенные цепи — это не просто элемент механики, а настоящая находка для бизнеса! Они широко используются в различных отраслях: от сельского хозяйства до строительства, обеспечивая надежную передачу усилия и долговечность - цепь круглозвенная. |
sunsili ??? 2023-8-14 22:05 Сертификат ТР ТС – документ, подтверждающий безопасность продукции и соответствие требованиям конкретного технического регламента Таможенного Союза. Быстро оформим сертификация тс. |
Сертификат ТР ТС – документ, подтверждающий безопасность продукции и соответствие требованиям конкретного технического регламента Таможенного Союза. Быстро оформим сертификат тр тс. |
在生成动态库时,常常习惯性的加上 fPIC 选项,fPIC 有什么作用和意义,加不加有什么区别,这里做下小结。 fPIC 的全称是 Position Independent Code, 用于生成位置无关代码。什么是位置无关代码,个人理解是代码无绝对跳转,跳转都为相对跳转。 编译将报错 /usr/bin/ld: /tmp/ccCViivC.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC /tmp/ccCViivC.o: could not read symbols: Bad value 2、加 fPIC 选项 加上 fPIC 选项生成的动态库,显然是位置无关的,这样的代码本身就能被放到线性地址空间的任意位置,无需修改就能正确执行。通常的方法是获取指令指针的值,加上一个偏移得到全局变量 / 函数的地址。 加 fPIC 选项的源文件对于它引用的函数头文件编写有很宽松的尺度。比如只需要包含个声明的函数的头文件,即使没有相应的 C 文件来实现,编译成 so 库照样可以通过。 3、在内存引用上,加不加 fPIC 的异同 加了 fPIC 实现真正意义上的多个进程共享 so 文件。 多个进程引用同一个 PIC 动态库时,可以共用内存。这一个库在不同进程中的虚拟地址不同,但操作系统显然会把它们映射到同一块物理内存上。 对于不加 fPIC,则加载 so 文件时,需要对代码段引用的数据对象需要重定位,重定位会修改代码段的内容,这就造成每个使用这个 .so 文件代码段的进程在内核里都会生成这个 .so 文件代码段的 copy。每个 copy 都不一样,取决于这个 .so 文件代码段和数据段内存映射的位置。 可见,这种方式更消耗内存。 但是不加 fPIC 编译的 so 文件的优点是加载速度比较快。 |
-Wall 当GCC在编译过程中检查出错误的话,它就会中止编译;但检测到警告时却能继续编译生成可执行程序,因为警告只是针对程序结构的诊断信息,它不能说明程序一定有错误,而是存在风险,或者可能存在错误。虽然GCC提供了非常丰富的警告,但前提是你已经启用了它们,否则它不会报告这些检测到的警告。 在众多的警告选项之中,最常用的就是-Wall选项。该选项能发现程序中一系列的常见错误警告,该选项用法举例如下:
该选项相当于同时使用了下列所有的选项: ◆unused-function:遇到仅声明过但尚未定义的静态函数时发出警告。 ◆missing-braces:聚合初始化两边缺少大括号。 ◆Parentheses:在某些情况下如果忽略了括号,编译器就发出警告。 ◆return-type:如果函数定义了返回类型,而默认类型是int型,编译器就发出警告。同时警告那些不带返回值的 return语句,如果他们所属的函数并非void类型。 ◆sequence-point:出现可疑的代码元素时,发出报警。 ◆Switch:如果某条switch语句的参数属于枚举类型,但是没有对应的case语句使用枚举元素,编译器就发出警告(在switch语句中使用default分支能够防止这个警告)。超出枚举范围的case语句同样会导致这个警告。 ◆strict-aliasing:对变量别名进行最严格的检查。 ◆unknown-pragmas:使用了不允许的#pragma。 ◆Uninitialized:在初始化之前就使用自动变量。 需要注意的是,各警告选项既然能使之生效,当然也能使之关闭。比如假设我们想要使用-Wall来启用个选项,同时又要关闭unused警告,利益通过下面的命令来达到目的:
下面是使用-Wall选项的时候没有生效的一些警告项: ◆cast-align:一旦某个指针类型强制转换时,会导致目标所需的地址对齐边界扩展,编译器就发出警告。例如,某些机器上只能在2或4字节边界上访问整数,如果在这种机型上把char *强制转换成int *类型, 编译器就发出警告。 ◆Padded:如果结构体通过充填进行对齐则给出警告。 ◆unreachable-code:如果发现从未执行的代码时给出警告。 ◆Inline:如果某函数不能内嵌(inline),无论是声明为inline或者是指定了-finline-functions 选项,编译器都将发出警告。 ◆disabled-optimization:当需要太长时间或过多资源而导致不能完成某项优化时给出警告。 上面是使用-Wall选项时没有生效,但又比较常用的一些警告选项。本文中要介绍的最后一个常用警告选项是-Werror。使用该选项后,GCC发现可疑之处时不会简单的发出警告就算完事,而是将警告作为一个错误而中断编译过程。该选项在希望得到高质量代码时非常有用。 |
|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation
( 粤ICP备14060730号 )
|Sitemap
GMT+8, 2025-4-14 01:06 , Processed in 0.128336 second(s), 53 queries .
Powered by Discuz! X3.2 Licensed
© 2001-2013 Comsenz Inc.