`
abc20899
  • 浏览: 929002 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ubuntu下c编程

 
阅读更多
C 编程中相关文件后缀

.a 静态库 (archive)
.c C源代码(需要编译预处理)
.h C源代码头文件
.i C源代码(不需编译预处理)
.o 对象文件
.s 汇编语言代码
.so 动态库
单个源文件生成可执行程序

下面是一个简单的“hello, ubuntu”程序的源代码:

/* helloubuntu.c */
#include <stdio.h>
int main(int argc,char *argv[])
{
printf(“hello, ubuntu\n”);

return 0;
}
最简单直接的编译该代码为可执行程序的方法是,将该代码保存为文件 helloubuntu.c,并执行以下命令:

$ gcc -Wall helloubuntu.c

编译器通过检查命令行中指定的文件的后缀名可识别其为 C 源代码文件。GCC 默认的动作:编译源代码文件生成对象文件(object file),链接对象文件得到可执行程序,删除对象文件。由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out。在命令行中输入程序名可使其执行并显示结果:

$ ./a.out
hello, ubuntu
选项 -o 用来指定所生成的可执行程序的文件名。下面的命令生成名为 helloubuntu 的可执行程序:

$ gcc -Wall helloubuntu.c -o helloubuntu
在命令行中输入程序名将使其执行,如下:

$ ./helloubuntu
hello, ubuntu
源文件生成对象文件

选项 -c 指示 GCC 编译源代码文件,但将对象文件保留在磁盘中并跳过链接对象文件生成可执行文件这一步。在这种情况下,默认的输出文件的文件名同源代码文件名一致,只不过后缀换为 .o 。例如:下面的命令将生成名为 helloubuntu.o 的对象文件:T

$ gcc -c -Wall helloubuntu.c
选项 -o 可用来指定生成的对象文件的文件名。以下命令将产生名为kubuntu.o的对象文件:

$ gcc -c -Wall helloubuntu.c -o kubuntu.o
当构建对象库或者生成一系列对象文件以备稍后链接用时,一条命令即可从多个源码文件生成对应的对象文件。下面的命令将生成对象文件ubuntu.o, kubuntu.o 与 xubuntu.o:

$ gcc -c -Wall ubuntu.c kubuntu.c xubuntu.c
多个源文件生成可执行程序

即使多个源码文件被编译,GCC编译器也会自动进行链接操作。例如:下面的代码保存在名为 hellomain.c 的文件中并调用一个名为 sayhello()的函数:
/* hellomain.c */
void sayhello(void);
int main(int argc,char *argv[])
{
sayhello();
return 0;
}
以下代码保存在名为 sayhello.c 的文件中并定义了 sayhello() 函数:
/* sayhello.c */
#include <stdio.h>
void sayhello()
{
printf(“hello, ubuntu\n”);
}
下面的命令将两个文件分别编译为对象文件且将其链接为可执行程序 hello,并删除对象文件:

$ gcc -Wall hellomain.c sayhello.c -o hello
编译预处理

选项 -E 指示编译器只进行编译预处理。下面的命令将预处理源码文件 helloubuntu.c 并将结果在标准输出中列出:

$ gcc -E helloubuntu.c
选项 -o 用来将预处理过的代码定向到一个文件。像本文一开始给出的后缀列表所给出的,不需经过预处理的C源码文件保存为后缀为 .i的文件中,这种文件可以这样来获得:

$ gcc -E helloubuntu.c -o helloubuntu.i
生成汇编代码

选项 -S 指示编译器生成汇编语言代码然后结束。下面的命令将由 C 源码文件 helloubuntu.c 生成汇编语言文件 helloubuntu.s:

$ gcc -S helloubuntu.c
汇编语言的形式依赖于编译器的目标平台。如果多个源码文件被编译,每个文件将分别产生对应的汇编代码模块。

创建静态库

静态库是编译器生成的普通的 .o 文件的集合。链接一个程序时用库中的对象文件还是目录中的对象文件都是一样的。静态库的另一个名字叫归档文件(archive),管理这种归档文件的工具叫 ar 。

要构建一个库,首先要编译出库中需要的对象模块。例如,下面的两个源码文件为 hellofirst.c 和 hellosecond.c:

/* hellofirst.c */
#include <stdio.h>
void hellofirst()
{
printf(“The first hello\n”);
}
/* hellosecond.c */
#include <stdio.h>
void hellosecond()
{
printf(“The second hello\n”);
}
这两个源码文件可以用以下命令编译成对象文件:

$ gcc -c -Wall hellofirst.c hellosecond.c
程序 ar 配合参数 -r 可以创建一个新库并将对象文件插入。如果库不存在的话,参数 -r 将创建一个新的,并将对象模块添加(如有必要,通过替换)到归档文件中。下面的命令将创建一个包含本例中两个对象模块的名为 libhello.a 的静态库:

$ ar -r libhello.a hellofirst.o hellosecond.o
现在库已经构建完成可以使用了。下面的程序 twohellos.c 将调用该库中的这两个函数:
/* twohellos.c */
void hellofirst(void);
void hellosecond(void);
int main(int argc,char *argv[])
{
hellofirst();
hellosecond();
return 0;
}
程序 twohellos 可以通过在命令行中指定库用一条命令来编译和链接,命令如下:

$ gcc -Wall twohellos.c libhello.a -o twohellos
静态库的命名惯例是名字以三个字母 lib 开头并以后缀 .a 结束。所有的系统库都采用这种命名惯例,并且它允许通过 -l(ell) 选项来简写命令行中的库名。下面的命令与先前命令的区别仅在于 gcc 期望的找寻该库的位置不同:

$ gcc -Wall twohellos.c -lhello -o twohellos
指定完整的路径名可使编译器在给定的目录中寻找库。库名可以指定为绝对路径(比如 /usr/worklibs/libhello.a)或者相对与当前目录的路径(比如 ./lib/libhello.a)。选项 -l 不能具有指定路径的能力,但是它要求编译器在系统库目录下找寻该库。

创建共享库

共享库是编译器以一种特殊的方式生成的对象文件的集合。对象文件模块中所有地址(变量引用或函数调用)都是相对而不是绝对的,这使得共享模块可以在程序的运行过程中被动态地调用和执行。

要构建一个共享库,首先要编译出库中需要的对象模块。例如:下面是文件名为 shellofirst.c 和 shellosecond.c 的两个源码文件:
/* shellofirst.c */
#include <stdio.h>
void shellofirst()
{
printf(“The first hello from a shared library\n”);
}
/* shellosecond.c */
#include <stdio.h>
void shellosecond()
{
printf(“The second hello from a shared library\n”);
}
要将以上两个源码文件编译成对象文件,可以用下面的命令:

$ gcc -c -Wall -fpic shellofirst.c shellosecond.c
选项 -c 告诉编译器只生成 .o 的对象文件。选项 -fpic 使生成的对象模块采用浮动的(可重定位的)地址。缩微词 pic 代表“位置无关代码”(position independent code)。

下面的 gcc 命令将对象文件构建成一个名为 hello.so 的共享库:

$ gcc -Wall -shared shellofirst.o shellosecond.o -o hello.so
选项 -o 用来为输出文件命名,而文件后缀名 .so 告诉编译器将对象文件链接成一个共享库。通常情况下,链接器定位并使用 main() 函数作为程序的入口,但是本例中输出模块中没有这种入口点,为抑制错误选项 -shared 是必须的。

编译器能将后缀为 .c 的文件识别为 C 语言源代码文件,并知道如何将其编译成为对象文件。基于这一点,先前的两条命令我们可以合并为一条;下面的命令直接将模块编译并存储为共享库:

$ gcc -Wall -fpic -shared shellofirst.c shellosecond.c -o hello.so
下面的程序,存储在文件 stwohellos.c 内,是调用共享库中两个函数的主程序:
/* stwohellos.c */
void shellofirst(void);
void shellosecond(void);
int main(int argc,char *argv[])
{
shellofirst();
shellosecond();
return 0;
}
该程序可以用下面的命令编译并链接共享库:

$ gcc -Wall stwohellos.c hello.so -o stwohellos
程序 stwohello 已经完成,但要运行它必须让其能定位到共享库 hello.so,因为库中的函数要在程序运行时被加载。

超越命名惯例

如果环境要求你使用 .c 以外的后缀名来命名你的 C 源码文件,你可以通过 -x 选项来指定其对应的语言以忽略我们的命名规范。例如,下面的命令将从文件 helloworrld.jxj 编译 C 语言源代码并生成可执行文件 helloubuntu:

$ gcc -xc helloubuntu.jxj -o helloubuntu
通常,在没有 -x 选项的情况下,任何具有未知后缀名的源码文件名都被认为是连接器可以识别的选项,并在不做任何更改的情况下传递给链接器。选项 -x 对其后的所有未知后缀的文件都起作用。例如,下面的命令使 gcc 将 align.zzz 和 types.xxx 都作为 C 源码文件来处理:

$ gcc -c -xc align.zzz types.xxx
分享到:
评论

相关推荐

    Linxu_Ubuntu.rar_Ubuntu基本操作_Ubuntu编程_ubuntu_ubuntu 编程_编程开发手册

    在Ubuntu下进行编程,不仅有完善的开发工具,还有强大的调试和测试支持。例如,GDB是强大的C/C++调试器,Valgrind可用于内存错误检测,JUnit和pytest等测试框架支持单元测试。同时,Ubuntu还支持版本控制系统如Git,...

    Linux下C语言编程入门教程

    在Linux环境下进行C语言编程是许多开发者的基础技能之一。C语言是一种强大的、高效的编程语言,尤其适合系统级编程和嵌入式开发。本教程将帮助初学者了解如何在Linux操作系统中利用C语言进行编程。 首先,你需要...

    ubuntu下gcc编程入门

    ubuntu下gcc编程入门收藏 准备工作 如果你还没装编译环境或自己不确定装没装,不妨先执行 sudo apt-get install build-essential 如果你需要编译 Fortran 程序,那么还需要安装 gfortran(或 g77) sudo apt-get ...

    Ubuntu下内核编程之第一个模块helloworld(附源码)

    本篇文章将深入探讨如何在Ubuntu环境下编写你的第一个内核模块——一个简单的“Hello, World!”模块。 首先,我们要了解什么是内核模块。内核模块是可加载到运行中的Linux内核中的代码片段,它们允许我们向内核添加...

    ubuntu下gcc编程入门收藏

    ### Ubuntu 下 GCC 编程入门知识点汇总 #### 一、GCC 安装及配置 **1.1 安装基础编译工具** 在 Ubuntu 系统中安装 GCC 和其他相关工具之前,首先需要确保系统中已经安装了基本的编译环境。这可以通过以下命令来...

    一个很简单的Ubuntu下读写串口的C++程序

    自己写的一个很简单的Ubuntu下读写串口的C++程序,有比较详细的注释,分享给大家参考

    linux下c编程Linux下的c语言编程

    在Linux环境下进行C语言编程是一项基础且重要的技能,它涵盖了操作系统与编程语言的结合,能够帮助开发者更好地理解和利用操作系统资源。下面将详细讲解Linux下C语言编程的关键知识点。 1. **开发环境设置**:首先...

    c语言编写ubuntu下 录音程序

    总的来说,这个C语言录音程序展示了如何在Ubuntu环境下利用底层音频接口实现音频的录制和回放。通过学习和理解这个程序,开发者可以深入了解Linux音频系统的工作原理,为今后的音频开发打下坚实的基础。

    linux 下C语言编程

    通过阅读本书,开发者能够全面掌握Linux环境下C语言编程的核心技术和最佳实践,为成为一名合格的Linux/C程序员打下坚实的基础。无论是对于初学者还是有经验的开发者来说,这本书都是一个宝贵的资源。

    在linux下ubuntu的五子棋游戏c语言代码(20220212161732).pdf

    在 Linux 操作系统下,使用 C 语言开发的五子棋游戏代码是非常有趣和实用的编程项目。本文将对给定的代码进行详细的分析和解释,涵盖了操作系统、C 语言编程、图形化编程等多个方面的知识点。 一、操作系统相关知识...

    在linux下ubuntu的五子棋游戏c语言代码.doc

    在Linux下的Ubuntu系统中,开发一个五子棋游戏需要使用C语言编程。下面是相关的知识点: 1. 头文件的包含:在C语言编程中,需要包含相应的头文件以使用所需的函数和变量。在本例中,包含了stdio.h、stdlib.h、linux...

    Linux操作系统下C语言编程入门

    首先,要开始C语言编程,你需要安装一个Linux发行版,如Ubuntu、Fedora或Debian。安装后,确保更新系统到最新版本,以便获取最新的软件包和安全补丁。 接下来,安装C语言的编译器——GCC(GNU Compiler Collection...

    Ubuntu下Lcd和触摸屏模拟器_/dev/Ubuntu_LCD_surface9ju_VTSLcd_Ubuntu模拟lcd_

    在Ubuntu 16.04操作系统中,开发者经常需要对硬件设备进行软件模拟,以便在没有实际硬件的情况下进行测试和开发。在这个特定的场景中,我们关注的是如何模拟LCD(液晶显示器)和触摸屏,这对于嵌入式系统开发或者...

    Linux下c语言编程书籍资料

    Linux系统的成功也促进了与其配套的各种开发工具的发展,其中C语言编译器GCC和程序维护工具make在Linux平台下扮演着至关重要的角色。 GCC(GNU Compiler Collection)是Linux下最常用的C/C++语言编译器,它的全称是...

    linux下c语言编程的教程

    在Linux环境下进行C语言编程是一项基础且重要的技能,尤其对于那些致力于在开源世界发展的程序员来说。C语言作为底层编程的基础,被广泛应用于操作系统、设备驱动、嵌入式系统以及各种软件开发中。在这个Linux下的...

    linux c 再Ubuntu下实现电子相册

    5. **Ubuntu操作系统**:Ubuntu是基于Debian的开源Linux发行版,它提供了丰富的开发者工具和库,使得在Linux环境下开发C程序变得容易。这个项目中,Ubuntu可能提供了图形界面支持,或者使用命令行界面来展示电子相册...

    Ubuntu下内核编程之第一个模块

    ### Ubuntu下内核编程之第一个模块 #### 一、引言 在Linux系统中,内核模块是一种重要的软件组件,它允许用户动态地添加或移除功能而不必重启整个系统。这种灵活性对于系统管理和应用程序开发都非常有用。本文将...

    Ubuntu下Lcd和触摸屏模拟器,ubuntu下lcd和触摸屏模拟器下载,C/C++

    本篇文章将详细介绍如何在Ubuntu 16.04上使用C/C++语言通过模拟器进行LCD绘图显示。 首先,我们需要了解 `/dev` 目录下的设备节点。在Linux系统中,设备通常以文件的形式存在于 `/dev` 目录下,如 `/dev/fb0` 代表...

    linux操作系统下 c语言编程入门

    在Linux操作系统下学习C语言编程是一项基础且重要的技能,它为深入理解计算机系统和软件开发提供了坚实的基础。本文将深入探讨Linux环境中的C语言编程入门知识,帮助初学者快速掌握这个强大的编程语言。 首先,我们...

Global site tag (gtag.js) - Google Analytics