ubuntu下C编程

 

环境搭建

其实,linux下写C也是很容易的。IDE的话用 eclipse 集成 CDT
模块就行了。当然这属于重量级的了,就如同VC++之于windows一样。那有没有像Turbo
C那样的小工具呢,主要也就是用到它的编译功能。恩,这就是这次我们要说的 GCC 了。
      
根据 wikipedia (google)上的定义,GCC(GNU Compiler
Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器。它是GNU
toolchain的关键部分,亦是开放源代码的类Unix操作系统的标准编译器。
      
GCC跟Turbo
C的处理过程大同小异,其由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编
译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。所以,基本上可以这么说,用过
Turbo
C的,很容易就会习惯GCC了。

 

Description:

无法获得锁
/var/lib/dpkg/lock - open (11 Resource temporarily unavailable)

Unable to
lock the administration directory (/var/lib/dpkg/), is another process using
it?

Solution:

sudo rm
/var/cache/apt/archives/lock

sudo rm
var/lib/dpkg/lock

好了,现在我们来写个简单的程序吧。首先是安装GCC,如果你使用的是Ubuntu,则在终端中输入以下命令来安装GCC。
      
安装好GCC就可以写程序了?别急,现在GCC什么文件都还不能编译呢。还记得在Turbo
C上我们不是还要设置头文件的路径吗?是的,我们需要安装这些头文件,这就是build-
essential软件包。安装好这个包,系统就会自动安装上g++,libc6-dev,linux-libc-dev,libstdc++6-4.1-
dev等一些必须的软件和头文件的库。我们可以在终端中输入下面命令来安装:
sudo apt-get install build-essential

安装vim的编辑工具

sudo apt-get installvim-full

好了,环境搭建完毕,就让我们开始动手写程序吧。

C 编程中相关文件后缀

.a     静态库
(archive)
.c   
 C源代码(需要编译预处理)
.h   
 C源代码头文件
.i   
 C源代码(不需编译预处理)
.o   
 对象文件
.s   
 汇编语言代码
.so   
 动态库

单个源文件生成可执行程序

下面是一个简单的“hello, ubuntu”程序的源代码(用 gedit 或者 vi
写下这个程序,并保存为helloubuntu.c):

#include
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()的函数:

void sayhello(void);
int main(int argc,char *argv[])
{
 sayhello();
 return 0;
}

以下代码保存在名为 sayhello.c 的文件中并定义了 sayhello() 函数:

#include
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:

#include
void hellofirst()
{
 printf(“The first hello\n”);
}

#include
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 将调用该库中的这两个函数:

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
的两个源码文件:

#include
void shellofirst()
{
 printf(“The first hello from a shared
library\n”);
}

#include
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 内,是调用共享库中两个函数的主程序:

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

安装vim的编辑工具

sudo apt-get installvim-full

Ubuntu下编程环境GNU安装的更多相关文章

  1. ubuntu 下node 环境的安装

    1. 安装nodejs sudo apt-get install nodejs 注意:包名是nodejs 2. 建立node软连接 #找到nodejs位置 which nodejs # /usr/bi ...

  2. Opencv 2.4.9在Ubuntu下的配置与安装

    [原]Opencv 2.4.9在Ubuntu下的配置安装  Opencv 2.4.9在Ubuntu下的配置与安装 surgewong@gmail.com http://blog.csdn.net/su ...

  3. ubuntu下opencv2.4.9安装测试

    ubuntu下opencv2.4.9安装测试 whowhoha@outlook.com 一.依赖包安装 1.  build-essential 软件包 sudo apt-get install bui ...

  4. UBUNTU下Y86模拟器的安装和使用

    UBUNTU下Y86模拟器的安装和使用 由于上周在虚拟机中安装Y86模拟器中出现了一些问题并且没得到解决,所以上周实验是在实验楼上做的,这几天练习了UBUNTU下Y86模拟器的安装和使用. 参考博客: ...

  5. 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)

    原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...

  6. Ubuntu下hadoop环境的搭建(伪分布模式)

    Ubuntu下hadoop环境的搭建(伪分布模式) 一.必要资源的下载 1.Java jdk(jdk-8u25-linux-x64.tar.gz)的下载 具体链接为: http://www.oracl ...

  7. android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)

      android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创) 一直想搞NDK开发却一直给其他事情耽搁了,参考了些网上的资料今天终于把 ...

  8. Android NDK r8 Cygwin CDT 在window下开发环境搭建 安装配置与使用 具体图文解说

    版权声明:本博客全部文章均为原创.欢迎交流.欢迎转载:转载请勿篡改内容,而且注明出处,谢谢! https://blog.csdn.net/waldmer/article/details/3272500 ...

  9. Ubuntu16.04下LAMP环境的安装与配置

    Ubuntu16.04下LAMP环境的安装与配置 最近做个实验需要用到Ubuntu环境的靶场,所以这里介绍下Ubuntu环境下LAMP的安装与配置,话不多说,我们gkd! 1.Apache2的安装 首 ...

随机推荐

  1. Swift中if let name = optionName {}解释

    在Swift语法的if语句中,是不能出现这种情况的: let optionName = "Swift" if let name = optionName { print(" ...

  2. PSI在windows server2008服务器上的安装方法

    PSI(http://www.oschina.net/p/psi-crm)是一款开源进销存软件,功能较为齐全,使用比较方便.在windows server2008系统中安装时遇到了一些问题,总结解决方 ...

  3. 关于Java中获取当前系统时间

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...

  4. codeforces 676C C. Vasya and String(二分)

    题目链接: C. Vasya and String time limit per test 1 second memory limit per test 256 megabytes input sta ...

  5. Linux 进程管理子系统

    一.进程管理子系统 1.进程要素 (1). 程序与进程 程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体 进程:是一个执行中的程序,他是一个动态的实体. (2). 进程4要素 1.有 ...

  6. WPF 多语言 多资源 多皮肤 处理方案

    同时兼容这么多需求的解决方案 我想到的 只有通过 动态切换加载资源字典  前端用绑定的模式 达到托管最大化 多语言举例 我编辑了 两个 语言包 一个中文 一个英文  (语言包这个最好用T4 写个模板, ...

  7. WPF ScrollViewer(滚动条) 自定义样式表制作 再发一套样式 细节优化

    艾尼路 出的效果图 本人嵌套 WPF ScrollViewer(滚动条) 自定义样式表制作 图文并茂 WPF ScrollViewer(滚动条) 自定义样式表制作 (改良+美化) 源代码

  8. DWZ(JUI) 教程 中如何整合第三方jQuery插件

    Query插件一般是$(document).ready()中初始化 $(document).ready(function(){  // 文档就绪,初始化jQuery插件| });  // 或者或缩写形 ...

  9. XAPI(XenAPI)

      转载:http://www.cnblogs.com/dkblog/archive/2011/07/07/2099885.html 初识toolstack--XEN的XenServer管理的核心 什 ...

  10. 检测是否支持HTML5中的Video标签

    //检测是否支持HTML5 function checkVideo() { if (!!document.createElement('video').canPlayType) { var vidTe ...