精华内容
下载资源
问答
  • gcc编译流程,交叉编译

    千次阅读 2018-08-16 20:03:33
    gcc编译过程: 预编译:gcc -E c源文件 -o 输出i目标文件; 编译阶段:gcc -S i源文件 -o 输出s目标文件; 汇编阶段:gcc -c s源文件 -o 输出o目标文件; 链接阶段:gcc o源文件 -o 输出可执行文件; gcc...
    1. gcc编译过程:
      1. 预编译:gcc -E c源文件 -o 输出i目标文件;
      2. 编译阶段:gcc -S i源文件 -o 输出s目标文件;
      3. 汇编阶段:gcc -c s源文件 -o 输出o目标文件;
      4. 链接阶段:gcc o源文件 -o 输出可执行文件;
    2. gcc编译实例:
      1. gcc -g -Wall c源文件 -o 输出可执行文件;(-g表示在生成的目标文件中带调试信息,-Wall表示开启编译器常用的警告,-W不开启警告)
      2. gcc -g -Wall c源文件 -lm -o 输出可执行文件;(-lm表示链接外部库)

     

    1. 交叉编译:
      1. arm-linux-gcc -g c源文件 -o 生成目标文件;
      2. 产生问题:arm-linux-gcc test.c -o test
        报错如下
        /usr/local/arm/arm-2009q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/bin/ld: cannot open output file a.out: Permission denied
        collect2: ld returned 1 exit status
        我加上sudo arm-linux-gcc test.c -o test
        结果还是出错,出错信息如下
        sudo: arm-linux-gcc: command not found
      3. 解决办法:使用su获取root权限,而不改变工作环境;

                                XX:~$ sudo passwd root
                               [sudo] password for XX: 输入密码
                               确认:输入密码
                               再确认:输入密码
                               提示成功更新密码
                              此时,root用户已经启用。
                              进入root的操作如下:
                              XX:~$ su -root

                             密码:输入密码

                            这里说一下 su -root和su root的区别:

                            su  后面不加用户是默认切到 root
                            su  是不改变当前变量
                            su - 是改变为切换到用户的变量 
                            也就是说su只能获得root的执行权限,不能获得环境变量
                            而su -是切换到root并获得root的环境变量及执行权限,此时,已经可以进行root权限的操作了。

      

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • gcc编译参数

    千次阅读 2018-10-28 16:42:58
    gcc 编译流程: 预处理-Pre-Processing -E 选项指示编译器仅对输入文件进行预处理。当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里 gcc -E code.c -o code.i //.i文件 编译-Compiling -S ...

    gcc 编译流程:

    1. 预处理-Pre-Processing
      -E 选项指示编译器仅对输入文件进行预处理。当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里
      gcc -E code.c -o code.i //.i文件

    2. 编译-Compiling
      -S 编译选项告诉 GCC 在为 C 代码产生了汇编语言文件后停止编译。
      gcc -S code.i -o code.s //.s文件

    3. 汇编-Assembling
      -c 选项告诉 GCC 仅把源代码编译为目标代码。缺省时 GCC 建立的目标代码文件有一个 .o 的扩展名。
      gcc -c code.s -o code.o//.o文件

    4. 链接-Linking
      -o 编译选项来为将产生的可执行文件用指定的文件名。
      gcc code.o -o a//bin文件

    在这里插入图片描述

    其他选项:

    选型 描述 示例
    -g 产生带调试信息的编译后目标代码,供调试器(gdb)使用 gcc -g source.c
    -C 预处理时不删除注释信息 配合-E使用
    -O 使用编译优化级别1编译程序。O后还可附带其他的数值,表示不同的优化级别。级别越大优化效果越好,但编译时间越长 -O0:无优化(默认) 。 -O和-O1:优化可执行文件大小及执行时间,且不使编译时间明显增加。编译大型程序时会显著增加编译时内存的使用。 -O2:包含-O1的优化,并增加无需在目标文件大小和执行速度上进行折衷的优化。编译器不执行循环展开及函数内联,即不进行“空间换时间”的优化。该选项将增加编译时间和目标文件的执行性能。-Os:执行所有不增加目标文件大小的-O2选项,并执行专门减小目标文件大小的优化选项。 -O3: 打开所有-O2优化选项并且增加 -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload和-ftree-vectorize优化选项。[e.g.1]gcc -O1 source.c -o exec
    -shared 生成共享目标文件 用于建立共享链接库
    -w 禁止显示任何警告信息
    -Wall 显示全部警告信息
    –version 显示gcc版本号和版本信息
    展开全文
  • GCC编译选项详解

    千次阅读 2019-08-30 15:18:35
    1、gcc包含的c/c++编译器gcc,cc,...一般c程序就用gcc编译,c++程序就用g++编译  2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指...

         

          1、gcc包含的c/c++编译器gcc,cc,c++,g++

            gcc和cc是一样的,c++和g++是一样的。一般c程序就用gcc编译,c++程序就用g++编译 

      2、gcc的基本用法

            gcc test.c这样将编译出一个名为a.out的程序gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字 

      3、为什么会出现undefined reference to ‘xxxxx’错误

           首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm。 
      4、-l参数和-L参数

             -l参数就是用来指定程序要链接的库(库文件在/lib、/usr/lib和/usr/local/lib下),-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。

          放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了(-L指定路径,-l指定具体库,配合使用),比如常用的X11的库,它放在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest。

         另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.so.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如gtk1.2的链接参数生成程序是gtk-config,执行gtk-config –libs就能得到以下输出”-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm”,这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config除了–libs参数外还有一个参数是–cflags用来生成头文件包含目录的,也就是-I参数,在下面我们将会讲到。你可以试试执行gtk-config –libs –cflags,看看输出结果。现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办法是在编译命令行里加入这个xxxx-config --libs --cflags,比如编译一个gtk程序:gcc gtktest.c gtk-config --libs --cflags这样就差不多了。注意不是单引号,而是1键左边那个键。除了xxx-config以外,现在新的开发包一般都用pkg-config来生成链接参数,使用方法跟xxx-config类似,但xxx-config是针对特定的开发包,但pkg-config包含很多开发包的链接参数的生成,用pkg-config --list-all命令可以列出所支持的所有开发包,pkg-config的用法就是pkg-config pagName --libs --cflags,其中pagName是包名,是pkg-config--list-all里列出名单中的一个,比如gtk1.2的名字就是gtk+,pkg-config gtk+ --libs --cflags的作用跟gtk-config --libs --cflags是一样的。比如:gcc gtktest.cpkg-config gtk+ –libs –cflags`。 

      5、-include和-I参数

             -include用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现,-include参数很少用。-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个”xxxx.h: No such file or directory”的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。上面我们提到的–cflags参数就是用来生成-I参数的。 

      6、-O参数

             这是一个程序优化参数,一般用-O2就是,用来优化程序用的,比如gcc test.c -O2,优化得到的程序比没优化的要小,执行速度可能也有所提高(我没有测试过)。 

      7、-shared参数

           编译动态库时要用到,比如gcc -shared test.c -o libtest.so 

      8、几个相关的环境变量

            PKG_CONFIG_PATH:用来指定pkg-config用到的pc文件的路径,默认是/usr/lib/pkgconfig,pc文件是文本文件,扩展名是.pc,里面定义开发包的安装路径,Libs参数和Cflags参数等等。

           CC:用来指定c编译器。

           CXX:用来指定cxx编译器。

           LIBS:跟上面的–libs作用差不多。

          CFLAGS:跟上面的–cflags作用差不多。

          CC,CXX,LIBS,CFLAGS手动编译时一般用不上,在做configure时有时用到,一般情况下不用管。环境变量设定方法:export ENV_NAME=xxxxxxxxxxxxxxxxx 

           9、关于交叉编译

             交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上,比如在我们地PC平台(X86 CPU)上编译出能运行在sparc CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到sparc CPU平台上才能运行。当然两个平台用的都是linux。这种方法在异平台移植和嵌入式开发时用得非常普遍。

            相对与交叉编译,我们平常做的编译就叫本地编译,也就是在当前平台编译,编译得到的程序也是在本地执行。用来编译这种程序的编译器就叫交叉编译器,相对来说,用来做本地编译的就叫本地编译器,一般用的都是gcc,但这种gcc跟本地的gcc编译器是不一样的,需要在编译gcc时用特定的configure参数才能得到支持交叉编译的gcc。

            为了不跟本地编译器混淆,交叉编译器的名字一般都有前缀,比如sparc-xxxx-linux-gnu-gcc,sparc-xxxx-linux-gnu-g++ 等等10。交叉编译器的使用方法使用方法跟本地的gcc差不多,但有一点特殊的是:必须用-L和-I参数指定编译器用sparc系统的库和头文件,不能用本地(X86)的库(头文件有时可以用本地的)。例子:sparc-xxxx-linux-gnu-gcc test.c -L/path/to/sparcLib -I/path/to/sparcInclude

    展开全文
  • Linux下GCC编译C语言

    万次阅读 多人点赞 2018-06-12 20:49:50
    Linux下GCC编译C语言Linux下GCC编译C语言 1.创建一个.C文件 # vi/vim name.c 2.编译name.c文件,生成可执行文件 # gcc name.c 3.执行文件,在默认情况下产生的可执行程序名为a.out # ./a.out 4.通常可以...

    Linux下GCC编译C语言

    Linux下GCC编译C语言
    
    1.创建一个.C文件
    	# vi/vim  name.c
    
    2.编译name.c文件,生成可执行文件
    	# gcc name.c
    
    3.执行文件,在默认情况下产生的可执行程序名为a.out
    	# ./a.out
    
    4.通常可以通过gcc的“-o”选项来指定自己的可执行程序名称。
    	# gcc -o name name.c
      生成可执行文件 name 执行:
    	# ./name
    
    
    5.使用gcc的“-c”标记来编译支持库代码(对多个文件进行编译)
    	# gcc -c name.c
      输出结果为一个名为 name.o 的文件
    
    例子:	# gcc -c name.c
    	# gcc -c main.c
    	现在有了两个目标文件:name.o和main.o。它们包含能够被Linux执行的目标代码。
    再一次调用GCC来执行连接阶段的工作: 
    	# gcc -o NameMain name.o main.o
    执行调用:./NameMain
    
    命令简化:GCC对如何将多个源文件编译为一个可执行程序有内置的规则。 
    	# gcc -o NameMain name.c main.c 
    	# ./NameMain
    
    
    6. 使用外部函数库 
    GCC常常与包含标准例程的外部软件库结合使用,几乎每一个Linux应用程序都依赖于由GNU C函数库GLIBC。	
    编译命令:GCC的"-lm"选项,它告诉GCC查看系统提供的数学库(libm)
    	# gcc -o name -lm name.c
    
    
    7.共享函数库与静态函数库,Linux系统上的函数库分为两种不同的类型:共享的和静态的 。
    (1)静态函数库:每次当应用程序和静态连接的函数库一起编译时,任何引用的库函数中的代码都会被直接包含进最终的二进制程序。 
    
    (2)共享函数库:包含每个库函数的单一全局版本,它在所有应用程序之间共享。这一过程背后所涉及的机制相当复杂;
    但主要依靠的是现代计算机的虚拟内存能力,它允许包含库函数的物理内存安全地在多个独立用户程序之间共享。 
    
    (3)使用共享函数库不仅减少了文件的容量和Linux应用程序在内存中覆盖的区域,而且它还提高了系统的安全性;
    一个被许多不同程序同时调用的共享函数库很可能会驻留在内存中,以在需要使用它时被立即使用,而不是位于磁盘的交换分区中;
    这有助于进一步减少一些大型Linux应用程序的装载时间。
    
    
    
    
    

    展开全文
  • Linux C/C++编程之(八)gcc编译

    千次阅读 2020-06-29 22:22:34
    文章目录一、概述二、gcc编译的四个阶段三、gcc命令四、gcc编译1. gcc -E2. gcc -S: 生成汇编指令3. gcc - c: 生成二进制文件4. gcc -I: (包含头文件)5. gcc -o: 指定输出6. gcc -D xxxx: 编译时传递宏7. gcc -g: ...
  • GCC编译过程,了解编译原理

    千次阅读 2018-12-09 20:00:16
    1、GCC编译过程分解 以HelloWorld程序为例 2、预编译 规则: 命令:gcc -E XXX.c -o XXX.i   3、编译 词法分析、语法分析、语义分析及优化 --------------->> 汇编代码文件 命令:...
  • GCC编译常用命令

    千次阅读 2018-05-05 23:45:02
    GCC 编译命令 ----------------加入新公司后,基本上是一键式打包脚本,对于GCC基本上快忘了,重新拾起。GCC命令提供了非常多的命令选项,但并不是所有都要熟悉,初学时掌握几个常用的就可以了,到后面再慢慢学习...
  • gcc编译GTK+程序

    千次阅读 2019-10-15 10:28:04
    gcc编译 $ gcc Hello.c -o Hello `pkg-config --cflags --libs gtk+-3.0` pkg-config :返回关于已安装库的元数据信息。如果我们想使用某个特定的库,它将会提供必要的依赖库和包含文件给我们。pkg-config从...
  • gcc编译参数指定编码格式

    千次阅读 2016-11-18 12:10:45
    GCC编译时可以使用如下参数: -finput-charset 指定源文件的编码(若不指定,默认是UTF-8) -fexec-charset 指定多字节字符串(const char*)常量在编译后的程序里保存的编码集(若不指定,默认是UTF-8) -fwid
  • Linux安装gcc编译环境出错

    千次阅读 2018-08-24 17:28:16
    安装gcc编译环境报错异常: 原因:需要root用户。 解决方法: 安装Redis步骤: (1)安装gcc编译环境 (2)输入Y,继续安装。下载其他的包,耐心等待。 (3)以下显示gcc环境安装完成。 (4)下载redis的源码...
  • Windows下gcc编译链接

    千次阅读 2018-05-09 22:54:00
    在Windows的DOS下实现gcc编译和链接 这里主要看的是两篇写的很详细的文章 C语言多文件编译初探(一) C语言多文件编译初探(二) 1.首先,你的Windows电脑的编译器需要是gcc,不清楚的话按`win+r`,输入cmd,...
  • gcc编译原理

    千次阅读 2013-01-28 07:11:06
    使用gcc编译程序时,编译过程可被细分为四个阶段: (1)预处理 (2)编译 (3)汇编 (4)链接 例如hello.c程序 hello.c: #include int main(void) { printf (Hello world!\n); return 0; }   1、...
  • gcc 编译cpp时会有链接错误 用g++编译cpp则很稳 gcc test.cpp -lstdc++ 就行了 指定c++版本 可以用 -std=xxx 指定 -std=c++98 -std=c++99 -std=c++11 -std=c++14 -std=c++17
  • gcc编译的四个过程

    千次阅读 2019-11-02 19:49:05
    gcc是什么? GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些...gcc编译的四个过程 gcc在执行编译工作的时,分为以下四个过程: 1.预处理,生...
  • gcc编译的四个阶段

    千次阅读 2019-09-04 23:05:34
    gcc编译的四个阶段 如下图: 参数意义: -E Preprocess only; do not compile, assemble or link;只预处理,不会编译、汇编、链接 -S Compile only; do not assemble or link;只编译,不会汇编、链接 -c Compile and...
  • gcc编译过程四步

    2017-03-26 20:49:58
    gcc编译过程四步 步骤 命令 解释 预处理 gcc -o hello.i -E hello.c 插入#include<文件> #define替换等 编译 gcc -o hello.s -S hello.i 生成汇编代码 汇编 gcc -o hello.o -c hello.s 机器语言,二进制...
  • Linux中gcc编译过程分解

    千次阅读 2016-07-07 19:14:06
    GCC编译过程分解 以helloworld为例分析gcc编译过程: #include int main() {  printf(“Hello World\n”);  return 0; } GCC编译过程可以被细分为四个阶段:预处理 编译 汇编 链接 1.预处理 ...
  • GCC编译ARM篇

    千次阅读 2017-08-07 09:08:34
    ARM 平台下GCC编译相关介绍,待补充 ARM处理器架构ARM处理器架构,通过选项-march指定,如-march=armv7-a,目前常见的有armv5te,armv6和armv7-a等指令集指令集,通过选项-m指定,如-mthumb,常见的有 1. thumb ...
  • gcc编译成可执行程序

    千次阅读 2016-12-01 22:20:43
    原文地址:用gcc编译成可执行程序作者:教皇 #gcc hello.c 该命令将hello.c直接生成最终二进制可执行程序a.out 这条命令隐含执行了(1)预处理、(2)汇编、(3)编译并(4)链接形成最终的二进制可执行程序...
  • GCC 编译命令

    万次阅读 2018-12-25 09:58:00
    GCC 编译器在编译一个C语言程序时需要经过以下 4 步: 将C语言源程序预处理,生成.i文件。 预处理后的.i文件编译成为汇编语言,生成.s文件。 将汇编语言文件经过汇编,生成目标文件.o文件。 将各个模块的.o文件...
  • Gcc 编译时指定宏

    千次阅读 2017-01-04 19:19:12
    gcc 编译指定宏那在makefile里面 gcc -DMACRONAME=MACRODEF 或者 gcc -DMACRONAME 这样就定义了预处理宏,编译的时候可选代码就会被编译进去了。 举例说明: -Dmacro=string,等价于在头文件中定义:#define ...
  • GCC编译选项与GDB调试学习总结

    千次阅读 2017-09-24 14:16:21
    GCC编译选项与GDB调试学习总结GCC编译选项 GCC选项GCC编译相关的选项如下:–help:显示gcc帮助说明 -target-help:显示目标机器特定的命令行选项 –version:显示gcc版本号和版权信息 -E:只进行预处理,不编译 -S...
  • Date: 2019-3-13 前言     Gcc编译器套件中包含了Linux程序编译和链接的整个工具链,其中编译和链接选项控制了编译器和连接器的行为(比如打印输出、警告等)。下面总结了项目中遇到的Gcc编译链接选项的用法。
  • Linux系统GCC常用命令和GCC编译过程描述 前言: GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又  扩展能够支持更多编程语言,如Fortran、...
  • 【Linux】gcc编译过程

    千次阅读 2018-08-31 16:25:49
    gcc编译.c文件成为一个可执行程序需要经过四个过程 预处理 编译 汇编 链接 那么gcc是如何完成这些操作的呢? ?格式 :gcc -[选项] 要编译的文件 -[选项] 要生成的目标文件 每个过程都干了什么事? test.c文件...
  • gcc编译以及Makefile与GDB调试

    千次阅读 2017-07-11 13:22:10
    一:编译选项: gcc常用编译的选项: -c 表示编译源文件 -o 表示输出目标文件 -g 表示在目标文件中产生调试信息, 用于 gdb 调试 ... 编译时将宏定义传入进去 ...1、gcc 编译过程: 预编译--编译--汇编--链接 ...
  • gcc编译出错提示要怎样设置才会中文显示?各位大佬帮帮忙。小弟感激不尽
  • C语言再学习 -- GCC编译过程

    万次阅读 2016-11-25 21:04:42
    参看:GCC编译过程分解 一、GCC简介: gcc的原名叫做GNU C语言 编译器(GNU C Compile),只能编译C语言程序,后来很快就做了扩展,支持了更多的编程语言,比如C+ Object-c ...,改名为GNC 编译器 套件(GNU ...
  • gcc编译指定动态库路径

    千次阅读 2019-02-26 09:57:34
    看一下gcc编译时常用到的两个参数-l(小写L)和-L 当需要编译的程序中用到了外链库(非标准库)时,我们在编译时就需要用到-l参数,后面紧跟库名 如果程序用到了多线程库,编译时就得加上-lphread gcc test.c -...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,860
精华内容 27,544
关键字:

gcc编译