gcc入门详解(zz)

Linux下GCC入门 交叉编译指在一个平台上编译生成可以在另一个平台上运行的程序。GCC 可以进行交叉编译,尤其在嵌入式开发中非常常用。在编译大型项目时,可以使用 -j 选项来加速编译过程。该选项指定并行编译时使用的线程数。 阅读详情
 作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作 GCC 的时候,还只是把它当作仅仅一个 C 程序语言的编译器;GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。另一方面,说到 GCC 对于操作系统平台及硬件平台支持,概括起来就是一句话:无所不在。

1 程序编译过程


  GCC是CUI(命令行交互界面)程序,这让许多从Windows走出来 Guier们感到恐惧。实际上它也有许多前端窗口界面,Windows下有Dev C++,Linux下譬如KDevelopment,但既然选择了GCC还是将CUL进行到底吧,没有难与不难的问题,只有做与不做的问题!

  下面基于一个具体而微的程序,讨论GCC的使用。示例程序如下:

//test.c
#include <stdio.h>
int main(void)
{
  printf("Hello World!/n");
  return 0;
}

这个程序,一步到位的编译指令是:
gcc test.c -o test

  输出的可执行文件名为test,Windows用户可能会感到奇怪,可执行文件明怎么没有.exe扩展名呢?Linux系统中,文件类型并非以扩展名识别的!

  实质上,上述编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。
1.1 预处理
运行预处理命令:
gcc -E test.c -o test.i 或 gcc -E test.c

可 以输出test.i文件中存放着test.c经预处理之后的代码。打开test.i文件,看一看,就明白了。后面那条指令,是直接在命令行窗口中输出预处 理后的代码,而不是以文件作为输出设备。gcc的-E选项,可以让编译器在预处理后停止,并输出预处理结果。在本例中,预处理结果就是将stdio.h 文件中的内容插入到test.c中了。

  gcc的-o选项,用于输出处理结果到文件中。
1.2 编译为汇编代码
预处理之后,可直接对生成的test.i文件编译,生成汇编代码:
gcc -S test.i -o test.s

  gcc的-S选项,表示在程序编译期间,在生成汇编代码后,停止,-o输出汇编代码文件。

  生成的汇编代码如下:
    .file    "test.c"
    .section    .rodata
    .align 4
.LC0:
    .string    "Hello World,Linux programming!"
    .text
.globl main
    .type    main, @function
main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl    -4(%ecx)
    pushl    %ebp
    movl    %esp, %ebp
    pushl    %ecx
    subl    $4, %esp
    movl    $.LC0, (%esp)
    call    puts
    movl    $0, %eax
    addl    $4, %esp
    popl    %ecx
    popl    %ebp
    leal    -4(%ecx), %esp
    ret
    .size    main, .-main
    .ident    "GCC: (GNU) 4.1.0 20060304 (Red Hat 4.1.0-3)"
    .section    .note.GNU-stack,"",@progbits
1.3 汇编(Assembly)
如果你学过汇编语言,那么你就该知道程序编译到了这个地步,应当使用汇编器,将汇编语言翻译为机器代码了。这一步尤其重要,因为它决定了你生成的程序,能够运行在哪种机器上。gcc使用的汇编器是gas。

  在Intel IA-32平台上,还有一些常用的汇编器有:
  • 微软的MASM,这是Intel平台上所有汇编器的鼻祖了,它现在已不是微软的独立产品,只是与Visual Studio捆绑在一起。但微软允许其他组织免费分发MASM 6.0。
  • NASM,最初是为UNIX环境开发的商业汇编器,最近成为开源的了,可生成UNIX、MS-DOS和32位Windows格式的可执行文件。
  • HLA(high level assembler)是Randall Hyde教授创建的,可以在DOS、Windows和Linux操作系统上生成Intel指令码。但HLA设计的主要目的是向初级程序员讲授汇编语言,学院气太浓,不够实用。
与这些汇编器相比,gas可以在不同处理器平台上工作,通常它可以自动检测底层硬件平台并生成适合该平台的正确机器指令码。gas另一个特性是能够创建不同于程序设计所在平台的指令码,譬如我在Intel计算机上工作,但可以为MIPS计算机写程序。

  对于上一小节中生成的汇编代码文件test.s,gas汇编器负责将其编译为目标文件,如下:
gcc -c test.s -o test.o

1.4 连接
gcc连接器是gas提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

  对于上一小节中生成的test.o,将其与C标准输入输出库进行连接,最终生成程序test:
gcc test.o -o test

在命令行窗口中,运行test这个小程序,让它说HelloWorld吧!

2、多个程序文件的编译



  通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用GCC能够很好地管理这些编译单元。假设有一个由test1.c和 test2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序test,可以使用下面这条命令:
# gcc test1.c test2.c -o test

  如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令:
# gcc -c test1.c -o test1.o
# gcc -c test2.c -o test2.o
# gcc test1.o test2.o -o test

需要打这么多编译指令,看着都累,许多Guier们又要抱怨了。的确如此,如果单单使用GCC来编译你的程序,一千个程序源文件的项目编译至少要在命令 行窗口中敲1k次文件名,才能完成一次编译。如果代码有了改动,重新编译,需要再原样输入一次编译指令。再技术高超的Cler也会累死的,但是很奇怪,那 些Cler们至今依然活的很生龙活虎,这得益于GNU Make工具,详情见Make基础一节。

3、检错



  GCC包含完整的出错检查和警告提示功能,可以帮助程序员写出更为标准、健壮的代码。如下面的代码:
//illcode.c
#include <stdio.h>
void main(void)
{
  long long int var = 1;
  printf("It is not standard C code!/n");
  printf("long long int var=%d",var);
}

这种代码,可能在老的C语言课本里能够见到,但它是不符合ANSI/ISO C语言标准的。我让同学在Visual Stdio .net 2003上编译了一下,没检测出什么问题来。下面看看GCC可不可以:
gcc -pedantic illcode.c -o illcode

输出结果:
illcode.c: 在函数 ‘main’ 中:
illcode.c:5: 警告:ISO C90 不支持 ‘long long’
illcode.c:4: 警告:‘main’ 的返回类型不是 ‘int’

-pedantic编译选项并不能保证被编译程序与ANSI/ISO C标准的完全兼容,它仅仅只能用来帮助Linux程序员离这个目标越来越近。或者换句话说,-pedantic选项能够帮助程序员发现一些不符合 ANSI/ISO C标准的代码,但不是全部,事实上只有ANSI/ISO C语言标准中要求进行编译器诊断的那些情况,才有可能被GCC发现并提出警告。

  如果采用默认的编译,即:gcc -pedantic illcode.c -o illcode。输出:
test.c: 在函数 ‘main’ 中:
test.c:4: 警告:‘main’ 的返回类型不是 ‘int’

上面的示例中,long long int是GNU C的扩展类型,表示64位整型数,这种类型没有纳入C/C++标准中,可见GCC默认的编译指令,无法完全检测出不符合标准C/C++的代码,但要比 Visual Stdio .net 2003一声都不吭要好一些。如果使用-pedantic选项,GCC就可以基本上按照标准C/C++进行代码检测了,不要挑剔什么,迄今为止没有任何一 款编译器完全支持标准C/C++的。
  
  除了-pedantic之外,GCC还有一些其它编译选项也能够产生有用的警告信息。这些选项大多以-W开头,其中最有价值的当数-Wall了,使用它能够使GCC产生尽可能多的警告信息。

   GCC给出的警告信息虽然从严格意义上说不能算作错误,但却很可能成为错误的栖身之所。一个优秀的Linux程序员应该尽量避免产生警告信息,使自己的 代码始终保持标准、健壮的特性。所以将警告信息当成编码错误来对待,是一种值得赞扬的行为!所以,在编译程序时带上-Werror选项,那么GCC会在所 有产生警告的地方停止编译,迫使程序员对自己的代码进行修改,如下:
gcc -Werror test.c -o test

  输出:
cc1: warnings being treated as errors
test.c: 在函数 ‘main’ 中:
test.c:4: 警告:‘main’ 的返回类型不是 ‘int’

4、库文件连接



  人家已经发明了轮子,而且物美价廉,那么我们就实在没有必要浪费生命再去发明同样的轮子!开发软件时,完全不使用第三方函数库的情况是比较少 见的,通常来讲都需要借助许多函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(so、或lib、 dll)的集合。虽然Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下; Windows所使用的库文件主要放在Visual Stido的目录下的include和lib,以及系统文件夹下。但也有的时候,我们要用的库不再这些目录下,所以GCC在编译时必须用自己的办法来查找 所需要的头文件和库文件。

  GCC采用搜索目录的办法来查找所需要的文件,-I选项可以向GCC的头文件搜索路径中添加新的目录。例如,如果在 /home/lyanry/include/目录下有编译时所需要的头文件,为了让GCC能够顺利地找到它们,就可以使用-I选项:
# gcc test.c -I /home/lyanry/include -o test

  同样,如果使用了不在标准位置的库文件,那么可以通过-L选项向GCC的库文件搜索路径中添加新的目录。例如,如果在 /home/lyanry/lib/目录下有链接时所需要的库文件libtest.so,为了让GCC能够顺利地找到它,可以使用下面的命令:
# gcc test.c -L /home/lyanry/lib -ltest -o test

   上面这条命令中,值得好好解释一下的是-l选项,它指示GCC去连接库文件libfoo.so。Linux下的库文件在命名时有一个约定,那就是应该以 lib三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用-l选项指定链接的库文件名时可以省去lib三个字母,也就是说GCC在对-lfoo 进行处理时,会自动去链接名为libfoo.so的文件。(注:至于在Windows下该怎样连接库文件,未做尝试,以后再谈)

   Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),二者的区别仅在于程序执行时所需的代码是在运行 时动态加载的,还是在编译时静态加载的。动态加载,意味着内存中仅存在一份库代码,所调用的函数只是在调用程序中存在一个映像。而静态加载,意味着将库中 所调用的函数代码复制到调用程序中。如果库中存在同名的静态库和动态库,则在默认情况下, GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接 库。例如,如果在 /home/xiaowp/lib/目录下有链接时所需要的库文件libtest.so和libtest.a,为了让GCC在链接时只用到静态链接库,可 以使用下面的命令:
# gcc test.c -L /home/xiaowp/lib -static -ltest -o test

5、优化



  代码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。GCC 提供的代码优化功能非常强大,它通过编译选项-On来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的GCC来讲,n的取值范围及其 对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。

  编译时使用选项-O可以告诉GCC同时减小代码的长度和执 行时间,其效果等价于-O1。在这一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。选项-O2告诉GCC除了完成所有-O1级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项-O3则除了完 成所有-O2级别的优化之外,还包括循环展开和其它一些与处理器特性相关的优化工作。通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越 快。许多Linux程序员都喜欢使用-O2选项,因为它在优化长度、编译时间和代码大小之间,取得了一个比较理想的平衡点。

  下面通过具体实例来感受一下GCC的代码优化功能,所用程序如下:

//testOpt.c
#include <stdio.h>

int main(void)
{
  double counter;
  double result;
  double temp;

  for (counter = 0; counter != 2000.0 * 2000.0 * 2000.0 / 20.0 + 2000; counter += (5 - 1) / 4)
  {
    temp = counter / 1979;
    result = counter;
  }
  printf("Result is %lf/n", result);
  return 0;
}
首先不加任何优化选项进行编译:

gcc -Wall testOpt.c -o testOpt

  借助Linux提供的time命令,可以大致统计出该程序在运行时所需要的时间:
$time ./testOpt
Result is 400001999.000000

real    0m7.759s
user    0m7.444s
sys     0m0.008s

  接下去使用-O1优化选项来对代码进行优化处理:

gcc -Wall -O testOpt.c -o testOpt

  测试运行时间:
$time ./testOPt
Result is 400001999.000000

real    0m2.445s
user    0m2.436s
sys     0m0.000s

接下去使用-O2优化选项来对代码进行优化处理:

gcc -Wall -O2 testOpt.c -o testOpt

  测试运行时间:
$time ./testOPt
Result is 400001999.000000

real    0m2.338s
user    0m2.320s
sys     0m0.004s

尽管GCC的代码优化功能非常强大,但作为一名优秀的Linux程序员,首先还是要力求能够手工编写出高质量的代码。如果编写的代码简短,并且逻辑性强,编译器就不会做更多的工作,甚至根本用不着优化。特别在以下一些场合中应该避免使用优化:
  1. 程序开发的时候优化等级越高,消耗在编译上的时间就越长,因此在开发的时候最好不要使用优化选项,只有到软件发行或开发结束的时候,才考虑对最终生成的代码进行优化。
  2. 资源受限的时候一些优化选项会增加可执行代码的体积,如果程序在运行时能够申请到的内存资源非常紧张(如一些实时嵌入式设备),那就不要对代码进行优化,因为由这带来的负面影响可能会产生非常严重的后果。
  3. 跟踪调试的时候对代码进行优化,容易导致某些代码可能会被删除或改写,或者为了取得更佳的性能而进行重组,从而使跟踪和调试变得异常困难。

6、程序性能分析 


 GCC支持的其它调试选项还包括-p和-pg,它们会将剖析(Profiling)信息加入到最终生成的二进制代码中。剖析信息即包含了更为详细的调试 信息(只是我这么觉得,由下面的例子可以证实),也对于找出程序的性能瓶颈很有帮助,是协助Linux程序员开发出高性能程序的有力工具。在编译时加入- p选项会在生成的代码中加入通用剖析工具(Prof)能够识别的统计信息,而 -pg选项则生成只有GNU剖析工具(Gprof)才能识别的统计信息。下面我们还是以crash.c程序的编译和调试,来看看使用-p选项对程序调试的 好处吧。

  编译:
 gcc -Wall -g -p crash.c -o crash

  调试:
[lyanry@lyanry crash]$ gdb -q crash
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) run
Starting program: /home/lyanry/program/c++/crash/crash
Reading symbols from shared object read from target memory...done.
Loaded system supplied DSO at 0x909000
Input an integer:11

Program received signal SIGSEGV, Segmentation fault.
0x00971667 in _IO_vfscanf_internal () from /lib/libc.so.6
(gdb) backtrace
#0  0x00971667 in _IO_vfscanf_internal () from /lib/libc.so.6
#1  0x00979337 in scanf () from /lib/libc.so.6
#2  0x08048520 in main () at crash.c:8

现在,可以从GDB输出结果中看到带有出错代码行号的backtrace结果了,即#2  0x08048520 in main () at crash.c:8,使用frame指令,查看出错代码,结果如下:
(gdb) frame 2
#2  0x08048520 in main () at crash.c:8
8         scanf("%d", input);

  现在有点清晰地知道问题发生在哪了吧!

  下面,来测试
-p或-pg选项用于分析程序的性能瓶颈,结合前面的叙述,看一下man手册上对-p和-pg选项的详细说明:
-p  Generate extra code to write profile information suitable for the
    analysis program prof.  You must use this option when compiling the
    source files you want data about, and you must also use it when
    linking.

-pg Generate extra code to write profile information suitable for the
    analysis program gprof.  You must use this option when compiling
    the source files you want data about, and you must also use it when
    linking.

  说明中所提及的prof和gprof,都是程序性能剖析工具,prof是通用的,gprof是GNU开发的。以例程profile.c来测试 gprof,在编译程序时要添加-gp选项。要注意,这个选项只是在连接期间产生作用的。profile.c代码清单如下:
//profile.c
#include <stdio.h>
void function1()
{
  int i=0,j;
  for(j=0;j<100000;j++)
    i+=j;
}
void function2()
{
  int i,j;
  function1();
  for(j=0;j<200000;j++)
    i=j;
}
int main(void)
{
  int i,j;
  for(i=0;i<100;i++)
    function1();
  for(j=0;i<50000;i++)
    function2();

  return 0;
}

编译:
gcc -Wall -pg profile.c -o profile

  运行profile程序,会在当前目录中生成一个gmon.out文件,下面可以使用gprof工具对profile程序进行剖析了:
gprof profile >gprof.txt

  上面指令执行时,gprof会自动使用gmon.out文件,将输出结果重定向到gprof.txt文件中。如果想知道gmon.out是什么,还是看看man手册里的描述吧:
 "Gprof" reads the given object file (the default is "a.out") and establishes the relation between its symbol table and  the  call  graph profile from gmon.out. 
  
  好了,现在要做的事情,就是在当前目录下打开gprof.txt,看看了,文件中,我们感兴趣的内容通常有两处:
Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total          
 time   seconds   seconds    calls  us/call  us/call  name   
 66.92     24.44    24.44    49900   489.78   731.38  function2
 33.08     36.52    12.08    50000   241.60   241.60  function1
与
index % time    self  children    called     name
                                                 <spontaneous>
[1]    100.0    0.00   36.52                 main [1]
               24.44   12.06   49900/49900       function2 [2]
                0.02    0.00     100/50000       function1 [3]
-----------------------------------------------
               24.44   12.06   49900/49900       main [1]
[2]     99.9   24.44   12.06   49900         function2 [2]
               12.06    0.00   49900/50000       function1 [3]
-----------------------------------------------
                0.02    0.00     100/50000       main [1]
               12.06    0.00   49900/50000       function2 [2]
[3]     33.1   12.08    0.00   50000         function1 [3]
-----------------------------------------------

  不想再细说下去,自己琢磨去吧。
计算机网络自顶向下(第八版)第一章课后习题 电路交换网络具有以下优点:资源独占性,在建立连接时,电路交换网络为通信双方独占一条物理路径,不会受到其他用户的影响。低时延,由于建立了专用路径,数据传输时延较小,适合对时延敏感的应用,如实时语音和视频通信。数据链路层:提供节点之间可靠的数据传输,主要任务是错误检测和纠正,以及数据帧的传输和访问控制。移动蜂窝网络:如4G LTE和5G,通过移动基站提供的无线信号实现移动设备的互联网接入。网络层:负责数据包的路由和转发,主要任务是通过网络选择最佳路径,进行流量控制和拥塞控制。手机,服务器,路由器,电脑; 阅读详情

相关推荐

PlutoSDR驱动安装避坑指南:从设备管理器异常到MATLAB 2023b完美识别

本文是一份详细的PlutoSDR驱动安装与MATLAB 2023b集成排错指南。针对Windows系统下常见的设备管理器异常、驱动兼容性问题,提供了从旧驱动清理、手动指定驱动文件到USB连接稳定性排查的完整解决方案。重点阐述了如何通过离线安装硬件支持包,并利用MATLAB命令进行连接测试与射频信号验证,最终实现设备的完美识别与稳定调用。

weixin_29159441的博客 428

GCC使用入门

GNU C Compiler(GCC)的作者是Richard Stallman,他是GNU项目的负责人,GCC是Linux的唯一编译器。GNU的意思是“GNU is Not Unix ”。GNU项目是在1984年开始的,其目的是创建一个免费的Unix-like操作系统。每一个Unix-like操作系统都需要一个C编译器,当时没有免费的C编译器,于是GNU项目开始开发一个免费的C编译器,即“GCC”。在1987年,第一个可移植的免费的C编译器——GCC发布。

weixin_69032308的博客 1334

腾讯会议+OBS虚拟摄像头:解决多人屏幕共享的终极指南(附常见问题排查)

本文详细介绍了如何利用OBS虚拟摄像头技术,解决腾讯会议中多人屏幕共享的痛点。通过将OBS作为视频混流中心,可以突破腾讯会议单屏共享的限制,实现多屏幕、多窗口内容的同步展示,并提升演示的专业度。文章涵盖了Windows与Linux双平台的配置步骤、高阶场景搭建以及常见问题(如黑屏、画中画)的排查方法,是团队协作与专业演示的实用指南。

i8j9k0l1的博客 931

GCC快速入门

文章目录目的总结 目的 总结

Naisu的各种笔记 1万+

统信UOS开发环境支持Java

集成了JDK和多种IDE,为开发者提供了从代码编写、编译、调试到部署的一站式开发解决方案。

RZer的博客 2255

Superpowers:可编程AI协作协议与Skill工程化实践

AI编程正从提示词驱动迈向工程化协作新范式。Superpowers并非传统代码补全工具,而是一套定义清晰、可版本控制、可调试复用的AI协作协议——它将AI能力抽象为带输入校验、执行管道、输出契约和元数据声明的Skill(类DSL构件),再通过状态驱动的Workflow编排实现跨平台、可熔断、含人工Checkpoint的自动化流水线。其核心价值在于解决AI生成代码长期存在的不可复现、不可审计、不可交接三大痛点,支撑OpenAPI转TS、Figma转Vue等高复用场景落地。本文深入解析Skill设计四重契约与P

weixin_31124163的博客 377

GCC入门详解

gcc的详细入门使用方法

m0_63101588的博客 1825

文章ACCEPT之后填写内容教程-Springer-Verlag即施普林格

1. 确认corresponding author通讯作者机构是否正确(最好细分到系,如搜不到系只填大学也可)这些信息因为在投稿的时候都填过,所以一般都没问题,可确认并继续。2. Co-Author: 这篇文章有没有其他作者,如果有就选yes,并确认投稿时所填的作者姓名和机构是否正确。这个也是如果前期都填对了就不用修改。3. Research funders: 问文章的研究有没有资助,没有就选no,有就选yes,并填写机构名称和grant/contact numbers。

ZhangJiqun&191cm&85kg 4786

GCC安装入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

1.下载GCC安装包,下载地址如下,选择需要的安装版本:https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/ 2.解压配置进入解压目录执行:./configure可能会遇到下面的问题:configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+. Try the --with-gmp, --with-mpfr and/or --with-mpc options to specif

wangluoanquan111的博客 3982

EtherCAT从站EEPROM组成信息详解(2):字8-15产品标识区

以实际的从站EEPROM数据为例,参照EtherCAT的SII规范,详细分析了从站EEPROM字8-字15的产品标识区内容组成。

kevin1499的博客 719

[Python图像处理] 二.OpenCV+Numpy库读取与修改像素

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~ 同时推荐作者的C++图像系列知识: [数字图像处理] 一.MFC详解显示BMP格式图片 [数字图像处理] 二.MFC单文档分...

杨秀璋的专栏 3万+

gcc入门

GCC编译器(Linux gcc命令)30分钟入门教程 http://c.biancheng.net/gcc/ 转载于:https://www.cnblogs.com/exciting/p/10952992.html

weixin_30278237的博客 173

c++对halcon的动态链接库dll封装及调用(细细讲)

本文详细介绍了将Halcon图像处理算法封装为C++动态链接库(DLL)的完整流程,包括7个关键步骤:1)封装Halcon函数并导出CPP文件;2)在C++项目中配置Halcon环境(包含目录、库目录设置);3)验证Halcon代码;4)创建DLL项目并进行环境配置;5)编辑DLL并导出生成文件(.dll、.lib、.h);6)在主项目中配置DLL调用环境;7)编写测试代码验证功能。通过这个流程实现了Halcon算法的模块化封装和复用,文中提供了具体的配置路径和代码示例,重点说明了环境配置细节和文件结构安排

Tianwen_running的博客 969

GCC 新手入门

本文是写给 gcc 新手的入门文章,所以内容比较简单。如果你知道下面3条命令都可以编译c++的话,就不用在本文浪费时间了 转自:http://forum.ubuntu.org.cn/viewtopic.php?f=70&t=98648&start=0代码:g++ -Wall hellocpp.cppgcc -Wall hellocpp.cpp -lstdc++gfortran -Wall h

qinzhonghello的专栏 909

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Linux之GCC经典入门教程

实测学习效果很好,可以参考 Linux之GCC经典入门教程 需要注意的是在makefile的源码里面,: clean: rm -f hello hello.o hello_fn.o 其实rm这行前面有一个TAB 还有fortran的hello world的例子,可以参考这篇文档,帖子里面的太老了 Hello world - Fortran Programming Language ...

m0_50588573的博客 509

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

[建议] GCC 新手入门

本文是写给 gcc 新手的入门文章,所以内容比较简单。如果你知道下面3条命令都可以编译c++的话,就不用在本文浪费时间了 代码: g++ -Wall hellocpp.cppgcc -Wall hellocpp.cpp -lstdc++gfortran -Wall hellocpp.cpp -lstdc++ 注:本文最新版在wiki中http://wiki.ubuntu....

dlt86904的博客 114

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

GCC入门问题

GCC:the GNU Compiler Collection GNU编译器集合,目前可编译:C, C++, Objective-C, Fortran, Java, and Ada等。GCC入门书推荐:An Introduction to GCCby Brian J. Gough, foreword by Richard M. Stallman

aweilark的专栏 607

linux下gcc编写java,linux 下c语言编程 GCC使用入门

本文来自:ubuntu中文论坛本文是写给 gcc 新手的入门文章,所以内容比较简单。如果你知道下面3条命令都可以编译c++的话,就不用在本文浪费时间了 代码:g++ -Wall hellocpp.cppgcc -Wall hellocpp.cpp -lstdc++gfortran -Wall hellocpp.cpp -lstdc++http://wiki.ubuntu.org.cn/C_Cpp_...

weixin_34619335的博客 232

Ubuntu 下gcc编程入门

今天学习了一下ubuntu下的gcc编程的一些东西,在这里和大家一起分享一下: step1:下载并安装GCC。 首先介绍一下ubuntu下不同文件的不同解压方式吧: 使用root限权解压: tar.gz包的解压方法: sudo tar zxvf file.tar.gz bz2包的解压方法一: sudo tar jxvf file.tar.bz2 bz2的解压方法二:

Chris_Home 1664

gcc入门手册

查看GCC手册 GCC手册在线阅读 GCC手册英文pdf版本 GCC手册中文pdf版本 查看gcc版本 #gcc -v gcc支持的文件 gcc编译过程 编译过程并不是一步到位的,分为预编译、编译、汇编、链接。 预处理:源文件.c --> 处理后的源文件.i 编译:源文件.i --> 汇编文件.s 汇编:汇编文件.s -->目标文件.o 链接:可重定位目标文件.o --> 可执行目标文件(ELF) 但是如果直接gcc hello.c,就会“直接”生成一个可执行文件a

喵小林菌的博客 2498

一文入门gcc

这个会用的多一点。-D后接我们要在编译时候注册的宏。我现在修改一下我们之前的test.c文件。然后我们直接编译,运行的结果是这样的。当我们使用了-D选项,则是下面这样的效果。通过这样的小例子,相信大家就对-D有了简单的认识了。今天在这边就介绍到这边了,对于我们后续学习Makefile来说是足够的。感觉不过瘾,想更深入了解gcc的小伙伴可以直接man gcc也可以去查官方文档。t=N7T8。

m0_63235356的博客 1541

Linux入门教程(gcc和gdb)

路径+可执行文件名 或者 路径+可执行文件名 & (将进程放到后台执行);可以把可执行文件放到 /usr/bin 就可以省略路径了;思考:为什么?ps :/usr/bin ps,ls,pwd (先了解)

Sonder_autistic的博客 748

GCC入门指南

GCC是Linux环境下开发的核心编译器工具集,支持C/C++等语言。其编译流程分为预处理、编译、汇编和链接四个阶段,可通过选项单独控制。常用命令包括:-o指定输出文件,-Wall开启警告,-g生成调试信息,-I/-L指定头文件和库路径,-D定义宏。GCC支持静态库(.a)和动态库(.so),并可通过优化选项(-O2)提升性能。多文件项目可统一编译或分段处理,数学库等需用-l参数链接。掌握GCC命令能有效控制编译过程,提高开发效率。

2401_88542533的博客 1724

Linux 基础入门操作-实验一 GCC使用

源代码就是程序员写出来的一个个代码文件,包括头文件和源文件。机器码是 CPU 可以直接解读的数据,由 0、1 组成,跟平台相关,ARM 平台跟 x86 平台的机器码是不一样的。程序语言是为了方便程序员的开发而产生的,用机器码开发程序是不可能的,于是出现了汇编、c、c++、c#、java 等程序语言,它们都需要经过编译器的编译生成可执行程序(由机器码组成)。

huanghongqi11的博客 944

GCC编译器入门指南:从基础到多文件编译

本文介绍了GCC编译器的基础用法和编译流程,适合C语言初学者和需要优化代码性能的开发者。文章从GCC的安装与验证开始,逐步引导读者编写并编译第一个GCC程序,详细解释了GCC的编译流程,包括预处理、编译、汇编和链接四个阶段。此外,文章还介绍了常用的编译选项,如基础选项、调试与优化选项、头文件与库的指定等,并提供了编译多文件项目的方法,包括直接编译和分步编译。最后,文章还涉及了静态库与动态库的创建与使用,以及常见问题的解决方法。通过本文,读者可以掌握GCC的基础知识,为进一步学习和优化代码打下坚实基础。

qq_22825391的博客 1051
上一篇: 惊遇上帝
下一篇: gcc常见选项(zz)
mindview
博客等级 码龄19年 7粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值