• [技术干货] 使用GDB调试C/C++程序进程卡死
    ​ 定位思路1、使用top命令查看相关进程仍在运行,确认是进程卡死。2、重新编译可调试版本,运行新版本,复现问题,GDB调试新版本。3、分析堆栈信息及业务逻辑,找出卡死原因。4、修改代码,重新编译进行验证。      1)若问题解决,则确认修改,合入原代码。      2)若问题未解决,增加定位信息,重新编译运行。案例 问题现象: 某软件在服务器上运行出现卡死问题。定位过程: 1、使用top命令查看进程仍存在,确认是卡死问题。2、重新编译该程序为可调试版本,重新运行,复现问题,查询该进程PID号。3、进入到程序的调测模式。gdb attach 2573说明:2573为该程序PID号。4、开启日志,将堆栈信息导出到文件。set logging file core_info.log set logging on thread apply all bt5、查看线程状态。info threads绝大部分线程都处在等待状态__lll_lock_wait。其中,等待的锁变量主要有两个,resource1和resource2。6、通过print命令查看,两个锁变量的信息。其中__owner表示当前该锁的持有者线程ID。可见,resource1由线程3889持有未释放,resource2由线程3892持有未释放。7、从上述收集的日志文件中找到ID为3889和3892的线程日志。从这两个线程的状态信息可以看出,3889号线程持有了锁resource1,但是本身在请求resource2;而3892号线程持有了锁resource2,但是本身在请求resource1。这两个线程的锁调用关系构成了死锁条件导致无法退出,同时,其他所有依赖这两个锁的线程都陷入了等待状态。8、根据上述堆栈信息,是threadOne和threadTwo直接相互调用导致死锁,查看业务代码逻辑,修改代码,重新编译,运行,问题未复现,确认修改代码合入,验证问题解决。​
  • [问题求助] 华为AICC22.100版本支持ocx开发方式吗?
    您好:【AICC版本信息】 AICC版本信息:AICC 22.100【问题场景及现象】参照老版本IPCC场景OCX开发方式,在AICC 22.100文档和软件包未发现有ocx控件和文档,请问此版本还支持ocx开发吗
  • [常见FAQ] c语言不能使用math.h库啥时候修复
    如题,c语言不能使用math.h库啥时候修复
  • [区域初赛赛题问题] 关于计划中的一些疑惑
    1.8号类型和9号类型工作站的工作周期指的是消耗原材料所需要的时间吗?还有在某一帧下9号类型的工作台可以接受同一个类型的若干个原料吗?比如说同时在某一帧下同时收购两个原料1。还是说9号类型每一帧只能接受某个特定类型的一个原料,需要等待下一帧,将该原料消耗后才可以继续收购该类型的下一个原料。2.工作台的id是按照输入格式中依次输入的K行工作台信息从0开始递增编号吗?或者说是在地图初始化时的按行依次的读入顺序吗?3.机器人与两个工作台的距离相同时的判定选择。这里的以排在前面的工作台的顺序为准是指的什么顺序?是指工作台的id顺序吗?
  • [C/C++] 使用Gcc进行多文件项目编译——转载
    简介一个软件项目往往包含多个源码文件,编译时需要将这些文件一起编译,生成一个可执行文件。假定一个项目有两个源码文件foo.c和bar.c,其中foo.c是主文件,bar.c是库文件。所谓“主文件”,就是包含了main()函数的项目入口文件,里面会引用库文件定义的各种函数。// File foo.c #include <stdio.h> int main(void) { printf("Ù89c2b62-7941-4ec4-b01c-2882396c4547n", add(2, 3)); // 5! }上面代码中,主文件foo.c调用了函数add(),这个函数是在库文件bar.c里面定义的。// File bar.c int add(int x, int y) { return x + y; }现在,将这两个文件一起编译。$ gcc -o foo foo.c bar.c # 更省事的写法 $ gcc -o foo *.c上面命令中,gcc 的-o参数指定生成的二进制可执行文件的文件名,本例是foo。这个命令运行后,编译器会发出警告,原因是在编译foo.c的过程中,编译器发现一个不认识的函数add(),foo.c里面没有这个函数的原型或者定义。因此,最好修改一下foo.c,在文件头部加入add()的原型。// File foo.c #include <stdio.h> int add(int, int); int main(void) { printf("Ù89c2b62-7941-4ec4-b01c-2882396c4547n", add(2, 3)); // 5! }现在再编译就没有警告了。你可能马上就会想到,如果有多个文件都使用这个函数add(),那么每个文件都需要加入函数原型。一旦需要修改函数add()(比如改变参数的数量),就会非常麻烦,需要每个文件逐一改动。所以,通常的做法是新建一个专门的头文件bar.h,放置所有在bar.c里面定义的函数的原型。// File bar.h int add(int, int);然后使用include命令,在用到这个函数的源码文件里面加载这个头文件bar.h。// File foo.c #include <stdio.h> #include "bar.h" int main(void) { printf("Ù89c2b62-7941-4ec4-b01c-2882396c4547n", add(2, 3)); // 5! }上面代码中,#include "bar.h"表示加入头文件bar.h。这个文件没有放在尖括号里面,表示它是用户提供的;它没有写路径,就表示与当前源码文件在同一个目录。然后,最好在bar.c里面也加载这个头文件,这样可以让编译器验证,函数原型与函数定义是否一致。// File bar.c #include "bar.h" int add(int a, int b) { return a + b; }现在重新编译,就可以顺利得到二进制可执行文件。$ gcc -o foo foo.c bar.c重复加载头文件里面还可以加载其他头文件,因此有可能产生重复加载。比如,a.h和b.h都加载了c.h,然后foo.c同时加载了a.h和b.h,这意味着foo.c会编译两次c.h。最好避免这种重复加载,虽然多次定义同一个函数原型并不会报错,但是有些语句重复使用会报错,比如多次重复定义同一个 Struct 数据结构。解决重复加载的常见方法是,在头文件里面设置一个专门的宏,加载时一旦发现这个宏存在,就不再继续加载当前文件了。// File bar.h #ifndef BAR_H #define BAR_H int add(int, int); #endif上面示例中,头文件bar.h使用#ifndef和#endif设置了一个条件判断。每当加载这个头文件时,就会执行这个判断,查看有没有设置过宏BAR_H。如果设置过了,表明这个头文件已经加载过了,就不再重复加载了,反之就先设置一下这个宏,然后加载函数原型。extern 说明符当前文件还可以使用其他文件定义的变量,这时要使用extern说明符,在当前文件中声明,这个变量是其他文件定义的。extern int myVar;上面示例中,extern说明符告诉编译器,变量myvar是其他脚本文件声明的,不需要在这里为它分配内存空间。由于不需要分配内存空间,所以extern声明数组时,不需要给出数组长度。extern int a[];这种共享变量的声明,可以直接写在源码文件里面,也可以放在头文件中,通过#include指令加载。static 说明符正常情况下,当前文件内部的全局变量,可以被其他文件使用。有时候,不希望发生这种情况,而是希望某个变量只局限在当前文件内部使用,不要被其他文件引用。这时可以在声明变量的时候,使用static关键字,使得该变量变成当前文件的私有变量。static int foo = 3;上面示例中,变量foo只能在当前文件里面使用,其他文件不能引用。编译策略多个源码文件的项目,编译时需要所有文件一起编译。哪怕只是修改了一行,也需要从头编译,非常耗费时间。为了节省时间,通常的做法是将编译拆分成两个步骤。第一步,使用 GCC 的-c参数,将每个源码文件单独编译为对象文件(object file)。第二步,将所有对象文件链接在一起,合并生成一个二进制可执行文件。$ gcc -c foo.c # 生成 foo.o $ gcc -c bar.c # 生成 bar.o # 更省事的写法 $ gcc -c *.c上面命令为源码文件foo.c和bar.c,分别生成对象文件foo.o和bar.o。对象文件不是可执行文件,只是编译过程中的一个阶段性产物,文件名与源码文件相同,但是后缀名变成了.o。得到所有的对象文件以后,再次使用gcc命令,将它们通过链接,合并生成一个可执行文件。$ gcc -o foo foo.o bar.o # 更省事的写法 $ gcc -o foo *.o以后,修改了哪一个源文件,就将这个文件重新编译成对象文件,其他文件不用重新编译,可以继续使用原来的对象文件,最后再将所有对象文件重新链接一次就可以了。由于链接的耗时大大短于编译,这样做就节省了大量时间。make 命令大型项目的编译,如果全部手动完成,是非常麻烦的,容易出错。一般会使用专门的自动化编译工具,比如 make。make 是一个命令行工具,使用时会自动在当前目录下搜索配置文件 makefile(也可以写成 Makefile)。该文件定义了所有的编译规则,每个编译规则对应一个编译产物。为了得到这个编译产物,它需要知道两件事。依赖项(生成该编译产物,需要用到哪些文件)生成命令(生成该编译产物的命令)比如,对象文件foo.o是一个编译产物,它的依赖项是foo.c,生成命令是gcc -c foo.c。对应的编译规则如下:foo.o: foo.c gcc -c foo.c上面示例中,编译规则由两行组成。第一行首先是编译产物,冒号后面是它的依赖项,第二行则是生成命令。注意,第二行的缩进必须使用 Tab 键,如果使用空格键会报错。完整的配置文件 makefile 由多个编译规则组成,可能是下面的样子。foo: foo.o bar.o gcc -o foo foo.o bar.o foo.o: bar.h foo.c gcc -c foo.c bar.o: bar.h bar.c gcc -c bar.c上面是 makefile 的一个示例文件。它包含三个编译规则,对应三个编译产物(foo.o、bar.o和foo),每个编译规则之间使用空行分隔。有了 makefile,编译时,只要在 make 命令后面指定编译目标(编译产物的名字),就会自动调用对应的编译规则。$ make foo.o # or $ make bar.o # or $ make foo上面示例中,make 命令会根据不同的命令,生成不同的编译产物。如果省略了编译目标,make命令会执行第一条编译规则,构建相应的产物。$ make上面示例中,make后面没有编译目标,所以会执行 makefile 的第一条编译规则,本例是make foo。由于用户期望执行make后得到最终的可执行文件,所以建议总是把最终可执行文件的编译规则,放在 makefile 文件的第一条。makefile 本身对编译规则没有顺序要求。make 命令的强大之处在于,它不是每次执行命令,都会进行编译,而是会检查是否有必要重新编译。具体方法是,通过检查每个源码文件的时间戳,确定在上次编译之后,哪些文件发生过变动。然后,重新编译那些受到影响的编译产物(即编译产物直接或间接依赖于那些发生变动的源码文件),不受影响的编译产物,就不会重新编译。举例来说,上次编译之后,修改了foo.c,没有修改bar.c和bar.h。于是,重新运行make foo命令时,Make 就会发现bar.c和bar.h没有变动过,因此不用重新编译bar.o,只需要重新编译foo.o。有了新的foo.o以后,再跟bar.o一起,重新编译成新的可执行文件foo。Make 这样设计的最大好处,就是自动处理编译过程,只重新编译变动过的文件,因此大大节省了时间。原文链接:https://wangdoc.com/clang/multifile.html
  • [C/C++] 鲲鹏920支持gcc4.4.7吗
    鲲鹏920支持gcc4.4.7吗,C++代码程序需要从x86上迁移到鲲鹏,依赖GCC4.4.7,发现鲲鹏装gcc4.4.7无法成功,是不支持吗
  • [交流分享] gcc编辑器的使用
     gcc编辑器的使用 简介 什么是gcc?  gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。现在很多程序员都应用GCC,怎样才能更好的应用GCC。目前,GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。本文将会介绍gcc编辑器的基本命令及使用方法。  检查gcc安装 使用gcc -v检查gcc是否安装 如果需要安装gcc可以使用以下命令进行安装yum install gcc gcc编译的过程 gcc编译过程一共分为4步分别是:  1、预处理,生成 .i 的文件[预处理器cpp] 2、将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs] 3、有汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as] 4、连接目标代码, 生成可执行程序 [链接器ld] 接下来开始认识一下gcc的常用命令 常用选项 gcc命令的基本格式 gcc [选项] [参数]   1、无选项直接编译 gcc 源文件 这里会直接默认输出a.out可以执行文件  2、选项 -o 将源文件进行进行编译后可以自定义输出可执行文件的名称 gcc test.c -o main 这里就会生成一个main的可执行文件,因为 Linux 下可执行文件的后缀仅仅是一种形式上的,所以可执行文件也可以不带后缀 使用./main可以直接执行  3、选项 -E gcc -E test.c -o test.i 将test.c预处理输出test.i文件。  4、选项 -S gcc -S test.i 将预处理输出文件test.i汇编成test.s文件。  5、选项 -c gcc -c test.s 将汇编输出文件test.s编译输出test.o文件。  6、选项 -O gcc -O1 test.c -o test 使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。  7、多源文件的编译方法 如果有多个源文件,基本上有两种编译方法: 假设有两个源文件为test.c和test1.c 多个文件一起编译 gcc test1.c test.c -o test 将testfun.c和test.c分别编译后链接成test可执行文件。  8、选项 -M 生成文件关联的信息。包含目标文件所依赖的所有源代码 gcc -M hello.c 9、  实际运用 建立一个文件夹 使用以下命令建立一个文件夹 mkdir code 进入到code中 cd code 开始创建第一个c语言文件——test.c touch test.c 使用vim 编辑如下内容 简单使用gcc对test.c进行编译,然后使用ls会发现在code目录下出现a.out可执行文件尝试运行a.out 使用如下命令./a.cout成功输出语句hello!,编译成功接下来尝试使用-o命令进行自定义编译出的可执行文件名为main.outgcc test.c -o main.out生成main.out文件注意这里在同一个目录下编译后的可执行文件不可以与源文件重名,否则会出现如下报错多源文件进行编译新建文件命名为printf.c,编辑如下内容void printf(){     printf("hello word\n"); } 编辑test.c文件内容为#include  void printf(); int main(){     printf();     return 0; }  使用如下命令进行编译链接 gcc printf.c test.c -o test 这样就将两个源文件进行编译连接起来  常见错误解决方法 file format not recognized; treating as linker script 注意在进行多源文件编译的时候源文件后缀一定要标明,因为GCC编译器套件对源代码的后缀是有要求的,它根据后缀来判断源码类型的。 一些常见的gcc文件后缀如下 .c为后缀的文件,C语言源代码文件;   .a为后缀的文件,是由目标文件构成的档案库文件;   .C,.cc或.cxx 为后缀的文件,是C++源代码文件;   .h为后缀的文件,是程序所包含的头文件;   .i 为后缀的文件,是已经预处理过的C源代码文件;   .ii为后缀的文件,是已经预处理过的C++源代码文件;   .m为后缀的文件,是Objective-C源代码文件;   .o为后缀的文件,是编译后的目标文件;   .s为后缀的文件,是汇编语言源代码文件;   .S为后缀的文件,是经过预编译的汇编语言源代码文件。 
  • [问题求助] GCC安装失败
  • [技术干货] UOS系统安装 毕昇JDK和GCC for OpenEuler
    第一步:获取软件包https://support.huaweicloud.com/ug-hgcc-kunpengdevps/kunpenghgcc_06_0004.htmlhttps://www.hikunpeng.com/developer/devkit/compiler/jdk第二步:上传到软件包到home目录下毕昇JDK安装将 bisheng ----.tar.gz 压缩包解压缩第三步:配置环境变量vi /etc/profileexport JAVA_HOME=/home/bisheng-jdk-17.0.2export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar第四步:使环境变量生效source /etc/profile第五步:查看安装结果Java -versionGCC for OpenEule安装第六步:创建GCC for openEuler安装目录mkdir -p /opt/aarch64/compiler 第七步:将GCC for openEuler压缩包拷贝到安装目录下cp -rf gcc-10.3.1-2021.09-aarch64-linux.tar.gz /opt/aarch64/compiler第八步:将 gcc ----.tar.gz 压缩包解压缩第九步配置环境变量export PATH=/opt/aarch64/compiler/gcc-10.3.1-2021.09-aarch64-linux/bin:$PATH export INCLUDE=/opt/aarch64/compiler/gcc-10.3.1-2021.09-aarch64-linux/include:$INCLUDE export LD_LIBRARY_PATH=/opt/aarch64/compiler/gcc-10.3.1-2021.09-aarch64-linux/lib64:$LD_LIBRARY_PATH第十步:使环境变量生效source /etc/profile最后查看安装结果 
  • [问题求助] 欧拉系统 GCC 用不了怎么办?
    【功能模块】gcc【操作步骤&问题现象】1、报cc1plus 找不到2、找不到对应的社区, 和问题解答【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 鲲鹏开发套件GCC for openEuler功能支持实践
    1、概述本实验指导用户基于华为云弹性服务器进行GCC for openEuler功能支持实践。2、操作流程2.1、登录实验环境进入【实验操作桌面】,打开Chrome浏览器,首次可自动登录并进入华为云控制台页面。2.2、配置环境登录弹性云服务器ECS点击左上角“服务列表”再点击“弹性云服务器ECS”,进入弹性云服务器ECS管理列表,在此可查看预置的弹性云服务器ECS的弹性公网IP,通过终端登录云主机,根据提示输入root账号密码。检查Glibc版本键入如下命令来检查Glibc的版本:利用mkdir命令生成安装目录并进入该目录:键入如下命令,下载GCC for openEuler编译器软件包:完成后,会生成如下文件。2.3、完整性校验键入如下命令,生成当前文件的哈希值:sha256sum文件用于软件包的完成性校验,键入如下命令,下载毕昇编译器sha256:将gcc-9.3.1-2020.12-aarch64-linux.tar.gz生成的哈希值与gcc-9.3.1-2020.12-aarch64-linux.tar.gz.sha256文件内容进行比较,一致则表示下载的软件包与网站发行的软件包一致。2.4、解压软件包在安装目录下(这里是/opt/aarch64/compiler),使用tar命令对软件包进行解压缩:解压后的文件夹全名为:gcc-9.3.1-2020.12-aarch64-linux。2.5、配置环境变量检查环境变量INCLUDE和LD_LIBRARY_PATH:如果输出为空,则表示INCLUDE和LD_LIBRARY_PATH两个环境变量原本没有值;如果输出不为空,则表示INCLUDE和LD_LIBRARY_PATH两个环境变量已经有值。打开/etc/profile文件,并在文件未尾部添加如下字段,并保存。执行下列命令让环境变量生效:2.6、验证版本信息键入如下命令,验证版本信息:3、GCC for openEuler功能支持实践3.1、程序编译使用一个swap函数验证GCC的程序编译功能,首先我们在个人文件夹(这里以/home/hgcc-tester为例)下创建swap.c文件:将如下所示的swap.c用例内容添加到swap.c文件中:键入如下命令进行编译和运行:3.2、动态取址增强选项-mcmodel=medium使能了32bit之外的动态取址操作,这里使用hello.f90 用例来演示验证此功能,此例中有size=85899*1000*10的大符号bar1。首先我们在个人文件夹下创建hello.f90,这里还是以/home/hgcc-tester为例进行演示:添加如下代码:保存后,键入如下命令,不加此选项编译hello.f90用例:gfortran  hello.f90 -o hello.out变量bar1的size大于-mlarge-data-threshold=1选项指定的阈值,使用mcmodel=medium分配内存,因此实现了64bit的相对PC寻址。3.3、使能四精度浮点库选项-DAARCH64_QUADMATH使能了四精度浮点使用,这里使用test.c用例来演示验证此功能,此例中有128位四精度浮点数。首先我们在个人文件夹下创建并编辑test.c,这里还是以/home/hgcc-tester为例进行演示:cd /home/hgcc-tester touch test.c vi test.c按下字母“i”键进入“插入模式(Insert mode)”编辑文件,将如下所示的test.c用例内容添加到test.c文件中:键入如下命令进行编译和运行:gcc test.c -o test.out -lquadmath -DAARCH64_QUADMATH./test.out3.4、矢量化增强选项-ftree-vect-analyze-slp-group使能可进行矢量化控制,在打开矢量化控制开关-ftree-vectorize的基础下,在编译命令中加入-ftree-vect-analyze-slp-group选项。这里使用a.c数组乘加运算用例来演示验证此功能,首先我们在个人文件夹下创建并编辑a.c,这里还是以/home/hgcc-tester为例进行演示:cd /home/hgcc-tester touch a.c vi a.c按下字母“i”键进入“插入模式(Insert mode)”编辑文件,将如下所示的a.c用例内容添加到a.c文件中:保存后,键入如下命令,在未打开该选项时进行编译和运行:gcc -O2 -funsafe-math-optimizations -fno-tree-reassoc -S a.c -o a.s && cat a.s观察到该测试用例在选项未打开时和打开后,生成的相关代码有明显差别,打开后可成功矢量化,至此实验已全部完成。综合上述实验,可以看到GCC for openEuler在除GCC通用功能和优化外,增加了新的功能支持,如mcmodel=medium、四精度浮点等;对中后端性能优化技术也进行了增强,包括浮点优化、SVE(可伸缩矢量化)等。
  • [技术干货] 【鲲鹏DevKit训练营】第一次实操作业中cmake和gcc的安装(如果需要安装的话)
    # 安装3.5.2版本cmake ## 1. 使用wget下载cmake源码包,可以下载到安装服务器任意目录,命令为: ``` wget https://cmake.org/files/v3.5/cmake-3.5.2.tar.gz --no-check-certificate ``` ## 2. 进入下载后的目录,解压源码包,命令为: ``` tar -zxvf cmake-3.5.2.tar.gz ``` ## 3. 进入解压后的文件夹,执行配置,编译和安装命令: ``` cd cmake-3.5.2 ./bootstrap --prefix=/usr make sudo make install ``` ## 4. 安装完成后重新执行`cmake --version`查看版本号: ``` camke --version ``` # 安装7.3.0版本gcc **以下步骤请在root用户下执行。** ## 1. 下载gcc-7.3.0.tar.gz。 ## 2. 安装gcc时候会占用大量临时空间,所以先执行下面的命令清空/tmp目录: ``` sudo rm -rf /tmp/* ``` ## 3. 安装依赖(以Ubuntu系统为例)。 Ubuntu执行如下命令安装: ``` apt-get install bzip2 ``` ## 4. 编译安装gcc。 (1)进入gcc-7.3.0.tar.gz源码包所在目录,解压源码包,命令为: ``` tar -zxvf gcc-7.3.0.tar.gz ``` (2)进入解压后的文件夹,执行如下命令下载gcc依赖包: ``` cd gcc-7.3.0 ./contrib/download_prerequisites ``` 如果执行上述命令报错,需要执行如下命令在“gcc-7.3.0/”文件夹下下载依赖包: ``` wget http://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 wget http://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 wget http://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz wget http://gcc.gnu.org/pub/gcc/infrastructure/isl-0.16.1.tar.bz2 ``` 下载好上述依赖包后,重新执行以下命令: ``` ./contrib/download_prerequisites ``` 如果上述命令校验失败,需要确保依赖包为一次性下载成功,无重复下载现象。 (3)执行配置、编译和安装命令: ``` ./configure --enable-languages=c,c++ --disable-multilib --with-system-zlib --prefix=/usr/local/gcc7.3.0 make -j15 # 通过grep -w processor /proc/cpuinfo|wc -l查看cpu数,示例为15,用户可自行设置相应参数。 make install ``` **注意**: 其中“--prefix”参数用于指定gcc7.3.0安装路径,用户可自行配置,但注意不要配置为“/usr/local”及“/usr”,因为会与系统使用软件源默认安装的gcc相冲突,导致系统原始gcc编译环境被破坏。示例指定为“/usr/local/gcc7.3.0”。 ## 5. 配置环境变量(请在实际需要时再进行配置) 例如用户在启动在线推理或训练进程前需执行如下命令配置环境变量。 ``` export LD_LIBRARY_PATH=/usr/local/gcc7.3.0/lib64:${LD_LIBRARY_PATH} ``` 其中“/usr/local/gcc7.3.0”为4.c中配置的gcc7.3.0安装路径,请根据实际情况替换。
  • [技术干货] 安装GCC 9.3.0
    1.下载GCC及依赖库wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gmp/gmp-6.1.0.tar.xz wget https://mirrors.tuna.tsinghua.edu.cn/gnu/mpfr/mpfr-3.1.4.tar.gz wget https://mirrors.tuna.tsinghua.edu.cn/gnu/mpc/mpc-1.0.3.tar.gz 2.安装gmptar -xvf gmp-6.1.0.tar.xz cd gmp-6.1.0 ./configure --prefix=/usr/local/gmp-6.1.0 make make install ln -s /usr/local/gmp-6.1.0 /usr/local/gmp 3.安装mpfrtar xzf mpfr-3.1.4.tar.gz cd mpfr-3.1.4 ./configure --prefix=/usr/local/mpfr-3.1.4 --with-gmp=/usr/local/gmp make make install ln -s /usr/local/mpfr-3.1.4 /usr/local/mpfr4.安装mpctar xzf mpc-1.0.3.tar.gz cd mpc-1.0.3 ./configure --prefix=/usr/local/mpc-1.0.3 --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr make make install ln -s /usr/local/mpc-1.0.3 /usr/local/mpc5.安装gcctar xzf gcc-9.3.0.tar.gz cd gcc-9.3.0 ./configure --prefix=/usr/local/gcc-9.3.0 --with-mpfr=/usr/local/mpfr --with-gmp=/usr/local/gmp --with-mpc=/usr/local/mpc make -j make install -j ln -s /usr/local/gcc-9.3.0 /usr/local/gcc # 修改环境变量 vim /etc/profile # 在/etc/profile 最后添加以下内容,保存 export PATH=/usr/local/gcc/bin:$PATH export LD_LIBRARY_PATH=/usr/local/gcc/lib64:$LD_LIBRARY_PATH export MANPATH=/usr/local/gcc/share/man:$MANPATH 6.查看gcc版本gcc -v
  • [问题求助] 在vscode中gcc编译器无法正常部署
    情况如图,求大神给看看
  • [技术干货] Linux系统下gcc命令使用详解
    大家好,本篇文章主要讲的是Linux系统下gcc命令使用详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览目录• 一.预处理 • 二. 编译 • 三.汇编 • 四.链接 1.gcc的安装(以Ubuntu为例) sudo apt-get install build-essential安装完后可以通过 gcc --version 查看版本。让我们在通过gcc编译可执行文件的过程中掌握其基础应用。准备: 先在当前目录下 使用vim新建一个.c文件 例如 666.c1$ vim 666.c(vim的使用可在我的另一篇博客有详细的叙述,这里不多在赘述)插入一段代码。12345678910#include <stdio.h>main(){    int a,i;    a=6;    for(i=0;i<3;i++)    {        printf("%d",a);    }}  (每次我们用 cat 查看)一.预处理1.预处理通过对宏定义(像#define)进行展开,对头文件(像 stdio.h)进行展开,对条件进行(像ifdef)编译,展开所有宏,删除所有注释(像"//").预处理cpp把源代码,头文件预编成一个.i文件。(注意这时并不检查语法,所以即使有语法错误也不会报错。)  2.命令:1$ gcc -E (源文件名) -o (预处理文件名)或者:1$ gcc (源文件名) > (预处理文件名)  例如按666.c 来说,预处理时可以是 :  gcc -E 666.c -o 666.i  也可以是 gcc 666.c > 666.i二. 编译   1.编译也就是检查语法是否错误,将预处理过的文件编译成汇编文件。   2.命令:1$ gcc -S (源文件) -o (汇编文件)  例如 gcc -S 666.i -o 666.s三.汇编1. 汇编也就是将汇编文件生成目标文件(二进制文件)通过汇编,文本代码变成了二进制代码。(二进制代码文件以.o为后缀名)。2.命令:1$ gcc -c (汇编文件) -o (目标文件)例如 gcc -c 666.s -o 666.o(这时候因为是二进制文件了,所以会乱码)四.链接1. 链接找到依赖的库文件(静态与动态),将目标文件链接为可执行程序。1$ gcc -c [目标文件] -o [可执行程序] -l[动态库名]假如没有动态库的话(一般)直接1$ gcc -c [目标文件] -o [可执行程序] 例如 gcc -c 666.o -o 666此时会生成可执行程序 666如果想执行使用该命令:1$ ./可执行程序其中./是在当前目录下的意思。例如 ./666(注意:在一般我们使用时 如果使用 gcc 可执行文件名,会默认生成a.out 可执行文件,这时我们直接执行它时用 ./a.out )转载自https://www.jb51.net/article/233584.htm
总条数:130 到第
上滑加载中