欢迎来到皮皮网官网

【csh源码解析】【apk源码下载】【android实例源码】gcc源码 main

时间:2024-12-30 04:29:19 来源:93华视包青天完整版源码

1.如何用GCC在linux下编译C语言程序
2.c语言编译过程及工程下的.c文件.h文件.o文件.so文件.a文件
3.GCC 源码编译安装
4.什么意思c语言程序编程 undefined reference to ?
5.使用gcc 编译C程序

gcc源码 main

如何用GCC在linux下编译C语言程序

       åœ¨Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器,假设我们有下面一个非常简单的源程序(hello.c):

       int main(int argc,char **argv)

       {

       printf("Hello Linux\n");

       }

       è¦ç¼–译这个程序,我们只要在命令行下执行:

       gcc -o hello hello.c

       gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程

       åºçš„输出结果了

       Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持位和位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

       Linux操作系统诞生于 å¹´ 月5 日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。

c语言编译过程及工程下的.c文件.h文件.o文件.so文件.a文件

       C语言的编译过程是一个将源代码转化为可执行文件的复杂步骤,主要由GCC编译器执行。GCC不仅是一个编译器,它在命令行环境下运行,通过gcc命令实现源文件的编译和链接。在工程中,csh源码解析源代码通常以.c和.h文件形式存在,而编译过程会生成.o文件(目标文件)和.so文件(共享对象文件),有时还会使用.a文件(静态库)。

       首先,GCC支持一次性编译和链接。以生成可执行文件为例,通过在命令行中输入gcc命令,如`gcc demo.c -o a.out`,即可直接生成名为a.out的可执行文件。还可以使用-o选项自定义文件名,如`gcc demo.c -o main.out`或省略后缀`gcc demo.c -o main`。运行程序则只需在终端中输入程序名。

       然而,GCC也支持分步编译,这涉及预处理、编译、汇编和链接四个阶段。预处理阶段处理宏定义、头文件和条件编译,使用`gcc -E hello.c -o hello.i`。编译阶段检查语法并生成汇编代码,用`gcc -S hello.i -o hello.s`。汇编阶段将.s文件转换为.o文件,`gcc -c hello.s -o hello.o`。apk源码下载最后,链接阶段将所有.o文件(或库)整合为可执行文件,如`gcc hello.o -o hello`。

       通过理解这些步骤,开发者可以灵活地控制编译过程,根据需要进行每个阶段的操作,以满足不同项目的需求。在实际编程工程中,熟练掌握GCC的这些用法对于高效开发至关重要。

GCC 源码编译安装

       前言

       本文主要介绍如何在特定条件下,通过源码编译安装GCC(GNU Compiler Collection)4.8.5版本。在Linux环境下,特别是遇到较老工程代码和低版本GCC适配问题时,网络仓库不可用,可通过下载源码进行本地编译安装。文章总结了该过程的步骤,以期帮助读者解决类似需求。

       Linux系统版本:SUSE Linux Enterprise Server SP5 (aarch) - Kernel \r (\l)

       GCC版本:gcc-4.8.5

       步骤如下:

       1,源码下载

       直接在Linux终端执行:wget ftp.gnu.org/gnu/gcc/gcc...

       或手动下载:ftp://gcc.gnu.org/pub/gcc/infrastructure

       选取对应的gcc版本下载。

       2,解压并进入目录

       解压下载的tar包:tar -jxvf gcc-4.8.5.tar.bz2

       进入解压后的目录:cd gcc-4.8.5

       3,配置依赖库

       联网情况下:cd gcc-4.8.5/

       ./contrib/download_prerequisites

       无法联网时,手动下载依赖库(如mpfr、gmp、mpc)并上传到指定目录,然后分别解压、重命名并链接。

       4,创建编译存放目录

       在gcc-4.8.5目录下执行:mkdir gcc-build-4.8.5

       5,android实例源码生成Makefile文件

       cd gcc-build-4.8.5

       ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

       推荐配置时,根据环境调整参数,如X_环境下的`--disable-libsanitizer`。

       6,执行编译

       make(可能耗时较长)

       解决可能出现的问题,如libc_name_p和struct ucontext uc,通过参考gcc.gnu.org/git或直接覆盖相关文件。

       7,安装GCC

       在gcc-build-4.8.5目录下执行:make install

       安装完成后,可直接解压并安装。

       8,配置环境变量

       执行命令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/gcc-4.8.5/mpc:/root/gcc-4.8.5/gmp:/root/gcc-4.8.5/mpfr

       确保路径一致,执行 source /etc/profile 使环境变量生效。

       9,检查安装情况

       通过`gcc -v`和`g++ -v`验证GCC版本。

       ,库升级

       遇到动态库未找到问题时,需升级gcc库,通过查找和替换最新库文件解决。

       ,卸载系统自带的gcc

       以root用户执行:rpm -qa |grep gcc | xargs rpm -e --nodeps

       ,修改ld.so.conf文件

       编辑文件:vi /etc/ld.so.conf,在最下面添加实际路径,如/usr/local/lib和/usr/local/lib。

       执行 ldconfig /etc/ld.so.conf。

       ,修改GCC链接

       确保GCC及其相关工具的正确链接,使用`ll /usr/bin/gcc*`和`ll /usr/bin/g++*`检查链接结果。

       至此,cm 源码下载GCC源码编译安装流程完成,可满足特定环境下的GCC版本需求。

什么意思c语言程序编程 undefined reference to ?

         最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:

       (。text+0x): undefined reference to `func'

       关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。

         

       1。 链接时缺失了相关目标文件(。o)

       测试代码如下:

       然后编译。

       gcc -c test。c

       gcc –c main。c

       得到两个 。o 文件,一个是 main。o,一个是 test。o ,然后我们链接 。

         o 得到可执行程序:

       gcc -o main main。o

       这时,你会发现,报错了:

       main。o: In function `main':

       main。c:(。text+0x7): undefined reference to `test'

       collect2: ld returned 1 exit status

       这就是android 5.0 源码最典型的undefined reference错误,因为在链接时发现找不到某个函数的实现文件,本例中test。

         o文件中包含了test()函数的实现,所以如果按下面这种方式链接就没事了。

       gcc -o main main。o test。o

       扩展:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译也会报undefined reference错,其实底层原因与上面是一样的。

         

       gcc -o main main。c //缺少test()的实现文件

       需要改成如下形式才能成功,将test()函数的实现文件一起编译。

       gcc -o main main。c test。c //ok,没问题了

       2。 链接时缺少相关的库文件(。

         a/。so)

       在此,只举个静态库的例子,假设源码如下。

       先把test。c编译成静态库(。a)文件

       gcc -c test。c

       ar -rc test。a test。o

       至此,我们得到了test。a文件。我们开始编译main。

         c

       gcc -c main。c

       这时,则生成了main。o文件,然后我们再通过如下命令进行链接希望得到可执行程序。

       gcc -o main main。o

       你会发现,编译器报错了:

       /tmp/ccCPAl。o: In function `main':

       main。

         c:(。text+0x7): undefined reference to `test'

       collect2: ld returned 1 exit status

       其根本原因也是找不到test()函数的实现文件,由于该test()函数的实现在test。

         a这个静态库中的,故在链接的时候需要在其后加入test。a这个库,链接命令修改为如下形式即可。

       gcc -o main main。o 。/test。a //注:。/ 是给出了test。a的路径

       扩展:同样,为了把问题说清楚,上面我们把代码的编译链接分开了,如果希望一次性生成可执行程序,则可以对main。

         c和test。a执行如下命令。

       gcc -o main main。c 。/test。a //同样,如果不加test。a也会报错

       3。 链接的库文件中又使用了另一个库文件

       这种问题比较隐蔽,也是我最近遇到的与网上大家讨论的不同的问题,举例说明如下,首先,还是看看测试代码。

         

       从上图可以看出,main。c调用了test。c的函数,test。c中又调用了fun。c的函数。

       首先,我们先对fun。c,test。c,main。c进行编译,生成 。o文件。

       gcc -c func。c

       gcc -c test。

         c

       gcc -c main。c

       然后,将test。c和func。c各自打包成为静态库文件。

       ar –rc func。a func。o

       ar –rc test。a test。o

       这时,我们准备将main。o链接为可执行程序,由于我们的main。

         c中包含了对test()的调用,因此,应该在链接时将test。a作为我们的库文件,链接命令如下。

       gcc -o main main。o test。a

       这时,编译器仍然会报错,如下:

       test。a(test。o): In function `test':

       test。

         c:(。text+0x): undefined reference to `func'

       collect2: ld returned 1 exit status

       就是说,链接的时候,发现我们的test。a调用了func()函数,找不到对应的实现。

         由此我们发现,原来我们还需要将test。a所引用到的库文件也加进来才能成功链接,因此命令如下。

       gcc -o main main。o test。a func。a

       ok,这样就可以成功得到最终的程序了。同样,如果我们的库或者程序中引用了第三方库(如pthread。

         a)则同样在链接的时候需要给出第三方库的路径和库文件,否则就会得到undefined reference的错误。

使用gcc 编译C程序

       GNU编译器gcc是GNU项目中的标准C和C++编译系统,用于执行C、C++和Object C等语言程序的编译任务。

       gcc的编译流程分为四个步骤:首先,使用gcc -E命令预处理源代码(HelloWorld.c)并生成中间文件(HelloWorld.i);其次,进行汇编处理(gcc -S HelloWorld.i -o HelloWorld.s);接着,将汇编代码编译为可重定位目标文件(gcc -c HelloWorld.s -o HelloWorld.o);最后,链接生成可执行文件(gcc HelloWorld.o -o HelloWorld)。编译器通过文件扩展名识别文件类型进行处理。

       make是一个自动编译管理工具,它根据文件的修改时间自动执行编译,通过Makefile配置编译规则。例如,有两个文件hello.c和hello.h,编译命令为gcc -c hello.c,对应的Makefile应写为:make hello.o。make会执行指定的编译命令生成目标文件。

       Makefile中变量的定义有递归展开和简单方式两种。递归展开可能导致无限循环,如VAR=var;简单方式则展开一次,如VAR:=var。变量在Makefile中的使用形式为$(VAR)。变量名通常由字母、数字和下划线组成,避免特殊含义字符。

       make还提供了多种自动变量,如S*表示目标文件名(不包含扩展名),S+列出所有依赖文件等。在Ubuntu环境下,编写Makefile如下,执行make main命令即可编译程序。

       总的来说,本文详细讲解了如何在Linux环境中使用gcc编译C程序,并介绍了make工具在自动化编译中的应用。

copyright © 2016 powered by 皮皮网   sitemap