#include < >与#include " "

#include < >:直接到系统指定的目录中去找头文件。

#include " " :先在源文件所在文件夹寻找,再到系统指定的目录中去找头文件。

gcc 常用命令

GCC是GNU C Compiler 的简写,GCC现在已经支持多种语言的编译,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。

//test.c
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
return 0;
}

最基本的gcc命令如下:

gcc test.c -o test

根据test.c文件生产可执行文件test。其实从.c文件到可执行文件会经历四步:预编译(Preprocessing),编译(Compilation),汇编(Assembly),链接(Linking)。

预编译

gcc -E test.c -o test.i 或 gcc -E test.c

得到汇编代码

gcc -S test.i -o test.s

得到目标文件

gcc -c test.s -o test.o

链接

gcc test.o -o test

多个文件的编译

gcc test1.c test2.c -o test

gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc test1.o test2.o -o test

第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。

优化选项 -O

gcc -O1 test.c -o test

使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。

检错

输出所有警告信息:

gcc -Wall test.c -o test

在所有产生警告的地方停止编译:

gcc -Werror test.c -o test

查看二进制文件相关命令

查看文件类型:

file

查看二进制文件链接到哪些库

ldd

查看二进制文件里面所包含的symbol,T表示加载,U表示undefined symbol

nm(选项)(参数)

选项:

-A:每个符号前显示文件名;
-D:显示动态符号;
-g:仅显示外部符号;
-r:反序显示符号表。

参数:

目标文件:二进制目标文件,通常是库文件和可执行文件。

读二进制文件里面的信息

readelf -a smu.o

将二进制文件转换为汇编

objdump -d sum.o

制作动态链接库

编写想要制作库的.h和.c文件

/*mylib.h*/
void lib_test();
/*mylib.c*/
#include "mylib.h"
#include <stdio.h>
void lib_test()
{
printf("This is a dynamic link library!\n");
}

输入命令:

gcc -shared -fPIC mylib.c -o libmylib.so

生产动态链接库libmylib.so文件。

接下来要就要使用动态链接库了。

编写:

#include "mylib.h"
int main()
{
lib_test();
}

输入命令:

gcc main.c -o main -L. -lmylib -Wl,-rpath,***         #***是动态链接库的路径

执行

./main

输出为:

This is a dynamic link library!

至此成功使用动态链接库。

参考:

Linux GCC常用命令

gcc指定头文件路径及动态链接库路径

Linux中动态链接库总结

linux 下动态链接实现原理

gcc 相关总结 动态链接库的更多相关文章

  1. [转载]GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结

    来自http://blog.csdn.net/benpaobagzb/article/details/51364005 GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有 ...

  2. 【转】GCC编译使用动态链接库

    相关gcc参数:-l -L -shared -fPIC -static -c -o   原文地址:[脚本之家]http://www.jb51.net/article/34990.htm     根据链 ...

  3. GCC 编译使用动态链接库和静态链接库的方法

    1 库的分类 依据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的.所以生成的可执行文件就不受库的影响了.即使库被删除了,程序依旧能够成功执行. 有别于静态库,动态库的链接是在程 ...

  4. Linux下GCC相关知识点

    摘要: 总结GCC的具体使用,动态库静态库的相关问题 参考资料: <Linux网络编程> ISBN:9787302207177 p19 1 GCC简介 GCC是Linux下的编译工具集,是 ...

  5. 利用GCC编译器生成动态链接库和静态链接库

    转载请标明:http://www.cnblogs.com/winifred-tang94/ 1.编译过程 gcc –fPIC –c xxx.c 其中-fPIC是通知gcc编译器产生位置独立的目标代码. ...

  6. GCC 编译使用动态链接库和静态链接库

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...

  7. GCC相关的环境变量

    介绍GCC在编译阶段和程序运行阶段用到的环境变量. GCC编译时用到的环境变量 GCC编译时用到的变量. C_INCLUDE_PATH GCC编译时查找头文件的目录列表.比如: echo $C_INC ...

  8. 【转】gcc 编译使用动态链接库和静态链接库

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...

  9. gcc相关

    linux操作系统上面开发程序, 光有了gcc 是不行的 它还需要一个   build-essential软件包作用是提供编译程序必须软件包的列表信息 也就是说 编译程序有了这个软件包它才知道 头文件 ...

随机推荐

  1. 基于GMC/umat的复合材料宏细观渐近损伤分析(一)

    近期在开展基于GMC/umat的复合材料宏细观渐近损伤分析,一些技术细节分享如下: 1.理论基础 针对连续纤维增强复合材料,可以通过离散化获得如下的模型: (a)(b)(c) 图1 连续纤维增强复合材 ...

  2. Spring MVC系列之模型绑定(SpringBoot)(七)

    前言 上一节我们在SpringBoot中启用了Spring MVC最终输出了HelloWorld,本节我们来讲讲Spring MVC中的模型绑定,这个名称来源于.NET或.NET Core,不知是否恰 ...

  3. Linux学习_菜鸟教程_2

    Linux 系统目录 /bin:  bin是Binary的缩写,这个目录存放着最经常使用的命令. /boot:  存放启动Linux时的一些核心文件,包括一些连接文件以及镜像文件. /dev : de ...

  4. ConcurrentHashMap源码解析 JDK8

    一.简介 上篇文章详细介绍了HashMap的源码及原理,本文趁热打铁继续分析ConcurrentHashMap的原理. 首先在看本文之前,希望对HashMap有一个详细的了解.不然看直接看Concur ...

  5. input 只允许输入小数

    oninput = "value=value.replace(/[^\d]/g,'')" 输入浮点数不好使 突发奇想自己写一个与众不同的... oninput="valu ...

  6. .Net Core 导出Html到PDF

    前言 最近由于项目的需求问题,涉及到了在.Net Core中导出PDF的一个问题,最后选择方式是后端拼接到Html页面然后再通过Html导出到PDF.中间也尝试了许多的NuGet包.但是并不如意,可用 ...

  7. 79.纯 CSS 创作单元素麦当劳金拱门 Logo(自创)

    效果地址:https://scrimba.com/c/cN3P6nfr 原理:两个椭圆,颜色部分为边框,下一半被伪元素覆盖. 感想:看了一眼大神的,代码比我的还少,得研究研究去. HTML code: ...

  8. 数据可视化之Matplotlib的使用

    1.什么是数据可视化 数据可视化在量化分析当中是一个非常关键的辅助工具,往往我们需要通过可视化技术,对我们的数据进行更清晰的展示,这样也能帮助我们理解交易.理解数据.通过数据的可视化也可以更快速的发现 ...

  9. Django自定义状态码

    class BaseResponse: def __init__(self): self.code = 1000 self.data = None self.error = None @propert ...

  10. 1.HelloWorld 仪式感

    HelloWorld: 1.随便新建一个文件夹,存放代码. 2.新建一个java文件 文件后缀改为 .java Hello.java 系统可能没显示文件后缀名,我们需要手动打开 3.编写代码 publ ...