gcc编译器用法
一个用c语言写的程序把他编译成计算机可执行的文件,一般有4个步骤
/*================================================================ * Copyright (C) 2018 . All rights reserved. * * 文件名称:helloworld.c * 创 建 者:ghostwu(吴华) * 描 述:gcc编译器用法演示 * ================================================================*/ #include <stdio.h> #define HELLO "hello world!\n" int main(int argc, char *argv[]) { printf( HELLO ); return 0; }
1,预处理:这个步骤,主要是包含头文件,展开宏定义
gcc -E helloworld.c -o helloworld.i
2,生成汇编代码
gcc -S helloworld.i -o helloworld.s
3,编译汇编
gcc -c helloworld.s -o helloworld.o
4,链接
gcc helloworld.o -o helloworld
通常写完程序,我们用 gcc helloworld.c -o helloworld 直接完成以上四个步骤
gcc常用选项含义:
1. -o output_filename
确定可执行文件的名称为output_filename。如果不给出这个选项,gcc就给出预设的可执行文件名a.out。
2. -c
只编译,不链接成为可执行文件,编译器只是由输入的.c等源文件生成.o为后缀的目标文件。
3. -g
产生调试工具(gdb)所必要的符号信息,要想对编译出的程序进行调试,就必须加入这个选项。
4. -ldirname
将dirname所指出的目录加入到程序头文件目录列表中。
5. -Ldirname
将dirname所指出的目录加入到库文件的目录列表中。
6. -Wall
生成所有警告信息。
gcc编译多个模块
helloworld.h
1 ============================================================== 2 * Copyright (C) 2018 . All rights reserved. 3 * 4 * 文件名称:helloworld.h 5 * 创 建 者:ghostwu(吴华) 6 * 描 述: 7 * 8 ================================================================*/ 9 10 #ifndef _HELLO_H_ 11 #define _HELLO_H_ 12 void say_hello( const char* name ); 13 #endif
helloworld.c
/*================================================================ * Copyright (C) 2018 . All rights reserved. * * 文件名称:helloworld.c * 创 建 者:ghostwu(吴华) * ================================================================*/ #include <stdio.h> #include "helloworld.h" void say_hello( const char* name ) { printf( "%s\n", name ); }
main.c
/*================================================================ * Copyright (C) 2018 . All rights reserved. * * 文件名称:main.c * 创 建 者:ghostwu(吴华) * 描 述: * ================================================================*/ #include "helloworld.h" int main(int argc, char *argv[]) { say_hello( "hello ghostwu" ); return 0; }
编译命令:
gcc helloworld.c main.c -o hello
打包静态库(就是一堆通用函数的集合,用.o文件打包):
1,首先生成.o文件
gcc -c helloworld.c -o helloworld.o
2,ar rcs libhello.a helloworld.o
r:替换 c:创建 s:保存
把helloworld打包成 libhello.a静态库
3,用静态库编译 生成 可执行文件
gcc -Wall main.c libhello.a -o main
也可以使用l和L 选项
小写的l: 指定库文件名
大写的L: 指定库所在的路径
gcc -Wall main.c -o main2 -lhello( 这种方式会报错,在链接库的时候,没有用L指定路径,默认情况下 不会在当前目录查找静态库 )
gcc -Wall -L. main.c -o main2 -lhello( L后面跟个. 代表当前目录下查找所链接的库(libhello.so) ), -lhello: 省略lib和后缀(.so)
这个时候删除静态库libhello.so,生成的main和main2文件,依然能执行,因为静态库已经被包含在可执行文件中
相关文章
- 缺少编译器要求的成员“System.Runtime.CompilerServices.ExtensionAttribute..ctor” 解决方案
- 专治编译器编辑器vscode中文乱码输出 win10 配置系统默认utf-8编码
- keil mdk编译器学习笔记(2)
- 《编译与反编译技术实战 》一1.5 编译器LLVM
- 如何查看linux程序被何种版本的编译器编译的?
- 《嵌入式 Linux C 语言应用程序设计(修订版)》一2.3 嵌入式Linux编译器GCC的使用
- 《Android游戏开发详解》——第2章,第2.5节魔术揭秘——编译器和JVM
- c+多态的本质:编译器维护了类型信息同时插入了解释执行机制
- ABI与编译器:ABI是由内核和工具链定义和实现的
- Swift 基础100问之 02 在Swift中如何实现C/C++中的#ifdef功能 编译器预处理
- Cmake调用NSIS(一个可执行文件,其实就是一个编译器)编译NSIS脚本问题研究
- 【历史上的今天】10 月 14 日:iPhone 十年之变;英国计算机协会成立;第一个 C++ 编译器诞生