linux GCC编译C程序

11 篇文章 3 订阅
5 篇文章 0 订阅

linux GCC编译C程序

GCC已不再是主要针对GNU项目自身的软件的小型C语言编译器了。如今,它已支持了许多不同的语言,包括C、C++、Ada、Fortran、Objective C,甚至还有Java。

利用gcc原理上是经过两步编译的,分别生成目标代码和Linux可执行程序。

1. 编译单个源文件

hello_linux.c

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
	printf("Hello linux\n");
    return 0;
}

使用如下命令编译并运行:

gcc hello.c -hello
./hello

默认情况下产生可执行程序程序名为a.out;可以通过gcc的-o参数指定生成可执行文件名称

2. 编译多个源文件

message.c

#include<stdio.h>
void goodbye_world(void)
{
    printf("Goodbye,world\n");
}

main.c

#include<stdlib.h>
void goodbye_world(void);
int main(int argc,char **argv)
{
	goodbye_world();
    return 0;
}

使用gcc编译这两个源文件,合并为一个可执行文件

gcc message.c -c
gcc main.c -c
gcc main.o message.o -o goodbye_world

使用gcc的-c参数编译支持库代码,输出为一个同名的后缀为.o的目标代码文件。它包含连接到一个较大程序的已编译目标代码。

最后将两个目标代码合并为一个可执行程序。

名的后缀为.o的目标代码文件。它包含连接到一个较大程序的已编译目标代码。

最后将两个目标代码合并为一个可执行程序。

3. 使用外部函数库

tric.c

#include <stdio.h>  
#include <stdlib.h>  
#include <math.h>  
  
#define MAX_INPUT 25  
  
int main(int agrc, char **argv)  
{  
        char input[MAX_INPUT];  
        double angle;  
  
        printf("Give me an angle (in radians) ==>");  
        if(!fgets(input, MAX_INPUT, stdin)){  
                perror("an error occurred.\n");  
        }  
        angle = strtod(input, NULL);  
  
        printf("sin(%e) = %e\n", angle, sin(angle));  
  
        return 0;  
} 

编译命令

gcc -o trig -lm trig.c

GCC参数-lm,调用系统提供的数学库(libm)

4. 共享函数库&静态函数库

LINUX程序函数库分为3种类型:静态函数库、共享函数库、动态加载函数库。

静态函数库:在编译时,引用的代码会被直接包含到程序中。

共享函数库(=动态加载函数库):在当一个可执行程序启动时才被加载。

5. 常用参数表

选项选项描述
-c只对文件进行编译和汇编,但不进行连接,生成目标文件”.o”
-S只对文件进行编译,但不汇编和连接
-E只对文件进行预处理,但不编译汇编和连接
-g在可执行程序中包含标准调试信息
-o file1 [file2]将文件file1编译成可执行文件file2
-v打印出编译器内部编译各过程的命令行信息和编译器的版本
-I dir在头文件的搜索路径列表中添加dir目录
-L dir在库文件的搜索路径列表中添加dir目录
-static强制链接静态库
-lNAME连接名为libNAME的库文件
-Wall -W开启GCC最常用的警告,GCC的warning一般格式为file:line-number:message
-pedantic要求严格符合ANSI标准
-Wconversion开启隐式类型转换警告
-Wshadow开启同名变量函数警告
-Wcast-qual开启对特性移除的cast的警告,如const
-O(-O1)对编译出的代码进行优化
-O2进行比-O高一级的优化
-O3产生更高级别的优化
-Os产生最小的可执行文件
-pg开启性能测试,记录每个函数的调用次数与时长
-ftest-coverage记录每一行被执行的次数
-fprofile-arcs记录每个分支语句执行的频率
-m32(64)生成32(64)位机器的汇编代码

参考

linux下GCC编译C程序(一)

在Ubuntu下搭建C/C++编程环境

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值