- 浏览: 914859 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
itzhongyuan:
java Random类详解 -
david_je:
你好,我看到你在C里面回调JAVA里面的方法是在native里 ...
Android NDK开发(1)----- Java与C互相调用实例详解 -
fykyx521:
请求锁是在 oncreate 释放实在ondestroy?? ...
Android如何保持程序一直运行 -
aduo_vip:
不错,总结得好!
Android读取assets目录下的资源 -
f839903061:
给的网址很给力哦!
Android 4.0.1 源码下载,编译和运行
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
.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
发表评论
-
GCC 编译使用动态链接库和静态链接库
2013-07-16 21:28 14351 库的分类 根据链接时期的不同,库又有静态库和动态库之分。 ... -
使用低版本gcc/g++
2013-06-08 14:22 1201解决方法为有两个 第一个方法: 上下载对应版本的.deb文件 ... -
Ubuntu解压缩zip,tar,tar.gz,tar.bz2
2013-05-30 11:33 1164ZIP zip可能是目前使用 ... -
ubuntu软链接和硬链接
2013-05-30 11:31 1353在Linux系统中,内核为每 ... -
Ubuntu APT常用命令参数
2013-05-30 11:30 963Ubuntu APT常用命令参数 具体介绍Ubuntu AP ... -
c++指针
2013-05-27 10:17 790#include<iostream.h> usi ... -
指针数组
2013-05-27 10:18 844#include<iostream.h> usi ... -
c++引用
2013-05-27 10:18 810#include<iostream.h> usi ... -
构造函数数据传递
2013-05-27 10:18 875#include<stream.h> using ... -
关键字数据类型
2013-05-27 10:18 856/*** * * asm, auto, bool, b ... -
类定义_头文件
2013-05-22 14:05 0Cat.h 文件 #include<iostream. ... -
c++函数
2013-05-22 13:50 0#include <iostream.h> us ... -
类定义_构造函数
2013-05-22 13:46 0/** * 关键字class的语法 * class c ... -
指针_类
2013-05-22 13:43 868#include<iostream.h> usi ... -
数组与string
2013-05-22 13:35 757#include <iostream.h> #i ... -
字符串输出
2013-05-22 13:34 784#include <iostream.h> us ... -
类的继承
2013-05-22 13:32 799类与对象 Animal.h 文件 #include<io ... -
类cat的定义
2013-05-22 13:30 839/** * 关键字class的语法 * class cla ... -
android应用后台安装
2013-05-21 12:02 943android应用后台安装,静默安装的代码实现方法 http ... -
编译linux内核映像
2013-05-21 11:33 937a)准备交叉编译工具链 android代码树中有一个pr ...
相关推荐
ubuntu下gcc编程入门收藏 准备工作 如果你还没装编译环境或自己不确定装没装,不妨先执行 sudo apt-get install build-essential 如果你需要编译 Fortran 程序,那么还需要安装 gfortran(或 g77) sudo apt-get ...
自己写的一个很简单的Ubuntu下读写串口的C++程序,有比较详细的注释,分享给大家参考
在Linux下的Ubuntu系统中,开发一个五子棋游戏需要使用C语言编程。下面是相关的知识点: 1. 头文件的包含:在C语言编程中,需要包含相应的头文件以使用所需的函数和变量。在本例中,包含了stdio.h、stdlib.h、linux...
在 Linux 操作系统下,使用 C 语言开发的五子棋游戏代码是非常有趣和实用的编程项目。本文将对给定的代码进行详细的分析和解释,涵盖了操作系统、C 语言编程、图形化编程等多个方面的知识点。 一、操作系统相关知识...
可能大家对于ubuntu下的编程开发工具不是很熟悉,就找了这个Geany的编写C语言的教程.分享给大家!~
在ubuntu16.04上模拟硬件lcd绘图显示, 用c语言使用绘图在lcd上显示
"Ubuntu22.04安装教程以及Ubuntu下C++环境配置" 本教程旨在指导读者如何安装 Ubuntu 22.04 操作系统,并配置 C++ 编程环境。下面将详细介绍安装和配置过程中的每一步骤。 一、安装 VMware 在开始安装 Ubuntu 之前...
ubuntu下,针对c/c++的vim开发环境搭建配置文件,重命名为.vimrc,放在~目录下即可
Ubuntu Linux 下安装 Eclipse 及运行 C 程序的安装步骤 操作系统: Ubuntu Linux 是一个基于 Debian 的 Linux 发行版,它提供了一个免费、开放源代码的操作系统。Ubuntu Linux 广泛应用于服务器、桌面计算机和移动...
Ubuntu 7.10 vivim 搭建超级 C/C++ 编程环境 以下是根据提供的文件信息生成的相关知识点: 标题:Ubuntu 7.10 vivim 搭建超级 C/C++ 编程环境 描述:使用 Ubuntu 7.10 和 vi/vim 搭建超级 C/C++ 编程环境,讨论了...
精确到微秒级、毫秒级、秒级、分钟级;、 还可获取当前时间戳
在 Ubuntu 环境下使用 Eclipse 需要安装相关的插件,例如 CDT(C/C++ Development Tooling),以便支持 C++ 语言的开发。Eclipse 的代码编辑器支持语法高亮、代码补全、代码重构等功能,提高了开发效率。 2. Anjuta...
在ubuntu系统中,可以使用Makefile来编译和链接c/c++程序。 三、编译和链接 编译是将源文件(*.c或*.cpp)编译成中间代码文件的过程,例如在linux系统中生成*.o文件。链接是将多个中间代码文件合成一个可执行文件...
在Ubuntu环境中使用C语言进行Linux编程Han Jun Media Publishing的Lee Jun译,Sungjae Kim译划分程序源的原因构造程序将整个程序划分为单独的文件,可以更轻松地掌握程序的整体组成。 减少构建时间通常,编译过程...
(原创)MODBUS协议的 C语言实现 学习MODBUS 可以参考下 实现功能 1 2 3 4 5 6 15 16
在Ubuntu中安装apache 安装指令: sudo apt-get install apache2 安装结束后: 产生的启动和停止文件是:/etc/init.d/apache2 启动: sudo apache2ctl -k start 停止: sudo apache2ctl -k stop 重新启动: sudo...
计算机网络编程,学习UDP和TCP的Ubuntu下socket编程,提供给大家学习和交流。
打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行文件;2. 输入“./test”...
Linux命令行与shell脚本编程、Linux C库函数及系统调用编程、Linux内核分析即应用、Debian(Ubuntu、Deepin)操作系统爬坑.zip Linux命令行与shell脚本编程、Linux C库函数及系统调用编程、Linux内核分析即应用、...
Linux命令行与shell脚本编程、Linux C库函数及系统调用编程、Linux内核分析即应用、Debian(Ubuntu、Deepin)操作系统爬坑.zip Linux命令行与shell脚本编程、Linux C库函数及系统调用编程、Linux内核分析即应用、...