linux下安装了6.1.0版本的gcc,但cmake时用的还是旧版的gcc

2024-05-01 18:59

1. linux下安装了6.1.0版本的gcc,但cmake时用的还是旧版的gcc

这个应该是动态库的问题吧,我之前遇到的问题就是这样解决的:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC\\检查动态库
mv /usr/lib64/libstdc++.so.6 /tmp\
ln -s /usr/local/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6
首先可以检查目前的链接库:
[root@ops-test01 gcc-6.1.0]# strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
果然是老的链接 ,GLIBCXX_3.4.13往后的都没有了
搜索新的链接库位置:
root@ops-test01 gcc-6.1.0]# find / -name libstdc++.so.6
/usr/lib64/libstdc++.so.6
/usr/local/lib64/libstdc++.so.6
/usr/local/src/gcc-6.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/src/gcc-6.1.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/src/gcc-6.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/root/vmware-tools-distrib/caf/usr/lib/vmware-caf/pme/lib/libstdc++.so.6
/root/vmware-tools-distrib/lib/lib64/libstdc++.so.6
/root/vmware-tools-distrib/lib/lib64/libstdc++.so.6/libstdc++.so.6
/root/vmware-tools-distrib/lib/lib32/libstdc++.so.6
/root/vmware-tools-distrib/lib/lib32/libstdc++.so.6/libstdc++.so.6
查找链接客户的内容,然后确定/usr/local/lib64/libstdc++.so.6是新的链接库,
移除老的链接库,然后关联新的链接库:
[root@ops-test01 gcc-6.1.0]# mv /usr/lib64/libstdc++.so.6 /tmp
[root@ops-test01 lib64]# cd /usr/lib64
[root@ops-test01 lib64]# ln -s /usr/local/lib64/libstdc++.so.6 libstdc++.so.6
[root@ops-test01 lib64]# strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
ok,现在在编译试试!!更多 Linux知识建议参考《Linux就该这样学》,加油!!!

linux下安装了6.1.0版本的gcc,但cmake时用的还是旧版的gcc

2. GNU GCC是干什么的,是不是开发环境,还是一种术语


3. GNU C的编译器 指的就是 GCC 吗 ?

(short for)gnu compiler collection,gnu是the Free Software Foundation组织的软件项目,主要目的是建立一个开源的类UNIX操作系统。
不过C语言初学者一般用TC集成环境编译,GCC的安装和使用并不简单, 不过它的确可以算是当今世纪最好的compiler了。

GNU C的编译器 指的就是 GCC 吗 ?

4. linux内核编译时出现“make: arm-linux-gcc:command not found

你没设置环境变量。
首先:你要着到arm-linux-gcc 所在的目录。比如 /opt/arm
然后:敲入命令 export PATH=$PATH:/opt/arm
这样就可以了 
如果你不知道arm-linux-gcc在哪,你可以这样。
1、cd /
2、find -name "arm-linux-gcc"
然后就能找到arm-linux-gcc了,你就知道在哪个目录里

5. 怎么在gnumakefile中将gcc

找不到makefile应该是当前目录下没有makefile文件吧,坚持下目录,还有,安装了gcc不一定带make的

怎么在gnumakefile中将gcc

6. 交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别

自己之前一直没搞清楚这两个交叉编译器到底有什么问题,特意google一番,总结如下,希望能帮到道上和我有同样困惑的兄弟…..
一. 什么是ABI和EABI 
1) ABI: 二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)
在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口. 
ABI涵盖了各种细节,如: 
数据类型的大小、布局和对齐; 
调用约定(控制着函数的参数如何传送以及如何接受返回值),例如,是所有的参数都通过栈传递,还是部分参数通过寄存器传递;哪个寄存器用于哪个函数参数;通过栈传递的第一个函数参数是最先push到栈上还是最后; 
系统调用的编码和一个应用如何向操作系统进行系统调用; 
以及在一个完整的操作系统ABI中,目标文件的二进制格式、程序库等等。 
一个完整的ABI,像Intel二进制兼容标准 (iBCS) ,允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作体统上运行。 
ABI不同于应用程序接口(API),API定义了源代码和库之间的接口,因此同样的代码可以在支持这个API的任何系统中编译,ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。
2) EABI: 嵌入式ABI 
嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。 
开发者使用自己的汇编语言也可以使用EABI作为与兼容的编译器生成的汇编语言的接口。 
支持EABI的编译器创建的目标文件可以和使用类似编译器产生的代码兼容,这样允许开发者链接一个由不同编译器产生的库。 
EABI与关于通用计算机的ABI的主要区别是应用程序代码中允许使用特权指令,不需要动态链接(有时是禁止的),和更紧凑的堆栈帧组织用来节省内存。广泛使用EABI的有Power PC和ARM.
二. gnueabi相关的两个交叉编译器: gnueabi和gnueabihf 
在debian源里这两个交叉编译器的定义如下: 
gcc-arm-linux-gnueabi – The GNU C compiler for armel architecture 
gcc-arm-linux-gnueabihf – The GNU C compiler for armhf architecture 
可见这两个交叉编译器适用于armel和armhf两个不同的架构, armel和armhf这两种架构在对待浮点运算采取了不同的策略(有fpu的arm才能支持这两种浮点运算策略)
其实这两个交叉编译器只不过是gcc的选项-mfloat-abi的默认值不同. gcc的选项-mfloat-abi有三种值soft,softfp,hard(其中后两者都要求arm里有fpu浮点运算单元,soft与后两者是兼容的,但softfp和hard两种模式互不兼容): 
soft   : 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。 
softfp : armel架构(对应的编译器为gcc-arm-linux-gnueabi)采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。 
hard   : armhf架构(对应的编译器gcc-arm-linux-gnueabihf)采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换, 性能最好,但是中断负荷高。
把以下测试使用的c文件内容保存成mfloat.c: 
#include  
int main(void) 
{ 
double a,b,c; 
a = 23.543; 
b = 323.234; 
c = b/a; 
printf(“the 13/2 = %f\n”, c); 
printf(“hello world !\n”); 
return 0; 
}
1)使用arm-linux-gnueabihf-gcc编译,使用“-v”选项以获取更详细的信息: 
# arm-linux-gnueabihf-gcc -v mfloat.c 
COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=hard’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’ 
-mfloat-abi=hard,可看出使用hard硬件浮点模式。
2)使用arm-linux-gnueabi-gcc编译: 
# arm-linux-gnueabi-gcc -v mfloat.c 
COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=softfp’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’ 
-mfloat-abi=softfp,可看出使用softfp模式。
三. 拓展阅读 
下文阐述了ARM代码编译时的软浮点(soft-float)和硬浮点(hard-float)的编译以及链接实现时的不同。从VFP浮点单元的引入到软浮点(soft-float)和硬浮点(hard-float)的概念
VFP (vector floating-point) 
从ARMv5开始,就有可选的 Vector Floating Point (VFP) 模块,当然最新的如 Cortex-A8, Cortex-A9 和 Cortex-A5 可以配置成不带VFP的模式供芯片厂商选择。 
VFP经过若干年的发展,有VFPv2 (一些 ARM9 / ARM11)、 VFPv3-D16(只使用16个浮点寄存器,默认为32个)和VFPv3+NEON (如大多数的Cortex-A8芯片) 。对于包含NEON的ARM芯片,NEON一般和VFP公用寄存器。
硬浮点Hard-float 
编译器将代码直接编译成发射给硬件浮点协处理器(浮点运算单元FPU)去执行。FPU通常有一套额外的寄存器来完成浮点参数传递和运算。 
使用实际的硬件浮点运算单元FPU当然会带来性能的提升。因为往往一个浮点的函数调用需要几个或者几十个时钟周期。
软浮点 Soft-float 
编译器把浮点运算转换成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传递。浮点参数的传递也是通过ARM寄存器或者堆栈完成。 
现在的Linux系统默认编译选择使用hard-float,即使系统没有任何浮点处理器单元,这就会产生非法指令和异常。因而一般的系统镜像都采用软浮点以兼容没有VFP的处理器。
armel ABI和armhf ABI 
在armel中,关于浮点数计算的约定有三种。以gcc为例,对应的-mfloat-abi参数值有三个:soft,softfp,hard。 
soft是指所有浮点运算全部在软件层实现,效率当然不高,会存在不必要的浮点到整数、整数到浮点的转换,只适合于早期没有浮点计算单元的ARM处理器; 
softfp是目前armel的默认设置,它将浮点计算交给FPU处理,但函数参数的传递使用通用的整型寄存器而不是FPU寄存器; 
hard则使用FPU浮点寄存器将函数参数传递给FPU处理。 
需要注意的是,在兼容性上,soft与后两者是兼容的,但softfp和hard两种模式不兼容。
默认情况下,armel使用softfp,因此将hard模式的armel单独作为一个abi,称之为armhf。 
而使用hard模式,在每次浮点相关函数调用时,平均能节省20个CPU周期。对ARM这样每个周期都很重要的体系结构来说,这样的提升无疑是巨大的。 
在完全不改变源码和配置的情况下,在一些应用程序上,使用armhf能得到20%——25%的性能提升。对一些严重依赖于浮点运算的程序,更是可以达到300%的性能提升。
Soft-float和hard-float的编译选项 
在CodeSourcery gcc的编译参数上,使用-mfloat-abi=name来指定浮点运算处理方式。-mfpu=name来指定浮点协处理的类型。 
可选类型如fpa,fpe2,fpe3,maverick,vfp,vfpv3,vfpv3-fp16,vfpv3-d16,vfpv3-d16-fp16,vfpv3xd,vfpv3xd-fp16,neon,neon-fp16,vfpv4,vfpv4-d16,fpv4-sp-d16,neon-vfpv4等。 
使用-mfloat-abi=hard (等价于-mhard-float) -mfpu=vfp来选择编译成硬浮点。使用-mfloat-abi=softfp就能兼容带VFP的硬件以及soft-float的软件实现,运行时的连接器ld.so会在执行浮点运算时对于运算单元的选择, 
是直接的硬件调用还是库函数调用,是执行/lib还是/lib/vfp下的libm。-mfloat-abi=soft (等价于-msoft-float)直接调用软浮点实现库。
在ARM RVCT工具链下,定义fpu模式: 
–fpu softvfp 
–fpu softvfp+vfpv2 
–fpu softvfp+vfpv3 
–fpu softvfp+vfpv_fp16 
–fpu softvfp+vfpv_d16 
–fpu softvfp+vfpv_d16_fp16.
定义浮点运算类型 
–fpmode ieee_full : 所有单精度float和双精度double的精度都要和IEEE标准一致,具体的模式可以在运行时动态指定; 
–fpmode ieee_fixed : 舍入到最接近的实现的IEEE标准,不带不精确的异常; 
–fpmode ieee_no_fenv :舍入到最接近的实现的IEEE标准,不带异常; 
–fpmode std :非规格数flush到0、舍入到最接近的实现的IEEE标准,不带异常; 
–fpmode fast : 更积极的优化,可能会有一点精度损失。

7. 问一下 安装好GNU ARM编译器后,需要配置环境变量GCCHOME和GCCLIBPATH。

看你的路径,应该是在Windows下。
控制面板 -> 系统 -> 高级 -> 环境变量
添加环境变量 选择用户变量下的“新建”,变量名为等号左边的变量(如:GCCHOME);变量值为等号右边的路径(如:C:\GNUDE
)

问一下 安装好GNU ARM编译器后,需要配置环境变量GCCHOME和GCCLIBPATH。

8. #if defined(__GNUC__)的意思是不是如果使用的是GCC编译器?

是的,就是编译器选择。
参考以下内容
Compiler name and version macros are predefined by all C/C++ 
compilers to enable #if/#endif sets around compiler-specific code, 
such as inline assembly, compiler-specific intrinsics, or special language 
features. This can be necessary in high-performance code that aims at using the 
best performance tricks available for each compiler. This article 
surveys common compilers and shows how to use predefined macros to detect the 
compiler name and version at compile time.
 
How to detect the compiler name
Compiler name macros indicate a specific compiler, such as Intel ICC or 
Microsoft Visual Studio. There are exceptions. See the notes after the 
table.
#if defined(__clang__)
	/* Clang/LLVM. ---------------------------------------------- */
#elif defined(__ICC) || defined(__INTEL_COMPILER)
	/* Intel ICC/ICPC. ------------------------------------------ */
#elif defined(__GNUC__) || defined(__GNUG__)
	/* GNU GCC/G++. --------------------------------------------- */
#elif defined(__HP_cc) || defined(__HP_aCC)
	/* Hewlett-Packard C/aC++. ---------------------------------- */
#elif defined(__IBMC__) || defined(__IBMCPP__)
	/* IBM XL C/C++. -------------------------------------------- */
#elif defined(_MSC_VER)
	/* Microsoft Visual Studio. --------------------------------- */
#elif defined(__PGI)
	/* Portland Group PGCC/PGCPP. ------------------------------- */
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
	/* Oracle Solaris Studio. ----------------------------------- */
#endif