Linux中编译C文件

C/C++程序编译的过程

预处理,展开头文件,宏定义,条件编译处理等。通过gcc -E source.c -o source.i或者cpp source.c生成。

编译。这里是一个狭义的编译意义,指的是将预处理后的文件翻译成汇编代码的过程。通过gcc -S source.i生成。默认生成source.s文件。

汇编。汇编即将上一步生成的汇编代码翻译成对应的二进制机器码的过程。通过gcc -c source.s来生成source.o文件。

链接。链接是将生成目标文件和其引用的各种符号等生成一个完整的可执行程序的过程。链接的时候会进行虚拟内存的重定向操作。

上面四个步骤就是C/C++程序编译的几个基本步骤。前面三个步骤都是很简单,大多时候会合并为一个步骤。只有第四个步骤链接是复杂一点的。

C/C++程序编译方式及生成指定文件

.o文件,即目标文件。一般通过.c或者.cpp文件编译而来,相当于VC编译出来的obj文件。

.a文件,archive 归档包,即静态库。其实质是多个.o文件打包的结果,相当于VC下的.lib文件。

.so文件,shared object 共享库(对象),相当于windows下的dll。

(1) 编译单个文件

$gcc file.c            #这是最简单形式,缺省输出为a.out
$./a.out               #执行
$gcc file.c -o file.o  #生成指定的可执行文件
$./file.o              #执行

(2) 编写及使用静态库(背景:main.c使用了sub.c中的函数,sub.c -> sub.o -> libsub.a)

$gcc -c sub.c                    #-c:只编译不链接
$ar -rsv libsub.a sub.o          #链接静态库
$gcc main.c -L./ -lsub -o main.o #main.c:主函数 -L:库文件路径 -l:后面接库文件名,全名为libsub.a
$./main.o                        #执行

(3) 编写及使用动态库(背景:main.c使用了sub.c中的函数,sub.c -> libsub.so)

$gcc -fpic -shared -o libsub.so sub.c #-shared:指定生成动态连接库 -fpic:编译为位置独立的代码
$gcc main.c -o main.o ./libsub.so
$./main.o                             #执行
时间: 2024-10-06 10:14:31

Linux中编译C文件的相关文章

linux中编译安装Apache、PHP、MySQL(上)

1.简介 在阿里云买了个云服务器,一直没时间折腾.过了近十天了吧,才有时间好好玩玩这个云服务器.自己是做Web开发的,所以我需要的开发环境是LAMP.之前打算是采用yum安装,不过yum安装apache可以安装到2.4版本,而PHP最高安装版本只能是5.4,这也是yum安装PHP的软肋,因此我这里主要涉及到的安装方式是源码安装.通过源码安装能够更好的管理这些软件,想安装到哪就放在哪. 云服务器: 阿里云CentOS 7.2 64位 阿帕奇版本:apache2.4 PHP版本:PHP5.6 主要的

Linux中编译并运行C

Linux中编译并运行C是很简单的,我们先创建一个文件,先cd到工作目录后输入 vi helloworld.c 在此文件中键入以下代码: 1 #include <stdio.h> 2 3 int main(void) 4 { 5 printf("Hello World\n"); 6 return 0; 7 } 输入:wq保存后退出. 再执行 cc helloworld.c 或 gcc helloworld.c进行编译,编译后生成a.out文件,然后在执行 ./a.out就行

Linux中如何查看文件的最初创建时间

查看 一个文件的 最初创建时间: Linux中如何查看文件的最初创建时间 linux 目前Linux没有直接查看创建文件的命令,你只能通过文件是否被修改过来进行判断. //查看代码stat 文件名 //例如:[[email protected] ~]# stat 1.txt  File: "1.txt"  Size: 18              Blocks: 8          IO Block: 4096   普通文件Device: fd00h/64768d    Inode

Linux中逐行读取文件的方法

  Linux中逐行读取文件的方法             在linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法.为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率. 方法1:while循环中执行效率最高,最常用的方法. function while_read_LINE_bottm(){ While read LINE do echo $LINE done   < $FILENAME } 注释:我习惯把

Linux中的随机数文件 /dev/random /dev/urandom

Linux中的随机数可以从两个特殊的文件中产生,一个是/dev/urandom.另外一个是/dev/random.他们产生随机数的原理是利用当前系统的熵池来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回.熵池就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以通过很多参数来评估,如内存的使用,文件的使用量,不同类型的进程数量等等.如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小,比如刚开机的时候,而当前需要大量的随机比特,这时产生的随机数的随机效果就不是很好了. 这就

解决 linux下编译.sh文件报错 “[: XXXX: unexpected operator” 问题

本人经常在linux通过编译 .sh文件来生成工程,之前一直都没问题,代码一直都没变,但是今天编译的时候,却提示错误: 然后我就表示很费解,查看我的.sh文件,其中有很多的[] ,都是这些报错,可是之前一直没问题. 后来发现,因为ubuntu默认的sh是连接到dash的,又因为dash跟bash的不兼容所以出错了.执行时可以把sh换成bash文件名.sh来执行.成功.dash是什么东西,查了一下,应该也是一种shell,貌似用户对它的诟病颇多. 修改sh默认连接到bash的一种方法: sudo

Linux 中httpd基于文件的用户的访问控制和CGI

基于用户访问控制(这里控制的是整个页面控制)         用户认证类型:             基本认证:Basic             摘要认证:digest,是否明文还是密文的控制. 虚拟用户:仅用于访问某服务和获取资源的凭证:         用户帐号密码存放位置:.htpasswd 这个文件用户名是明文的,密码是加密的.这个文件的名字也是你自己取的,一般我们不改动.htpasswd存放在httpd配置文件下即可                 实例:我们这里基于文件的认证(文件

Linux中如何清空文件

经常会碰到查看日志文件,如果日志文件太大,用less,more,vi,tail命令查看起来会比较麻烦,也挺难定位到具体错误,而定期备份,定期清空应该是好主意,当然清空之前必须备份.要是日志文件本身不存在,用mkdir可以建个空文件,但系统程序已经在调用,那么要如何清空其中文件,其实挺简单: 方法一: # cat /dev/null > error.log 方法二: # echo "" | tee error.log 方法三: # truncate -s error.log NOT

linux下编译make文件报错“/bin/bash^M: 坏的解释器,使用grep快速定位代码位置

一.linux下编译make文件报错"/bin/bash^M: 坏的解释器 参考文章:http://blog.csdn.net/liuqiyao_01/article/details/41542101#comments 自己测试的结果: [1]使用windows 下的编辑工具 新建文件doc2unix.sh #!/usr/bin/env bash # test PID=$(ps -aef | grep nginx | grep -v grep | grep master |awk '{print