#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. 组件与props简解

    一.创建组件 1.函数式创建 特点: 组件不能访问this对象 组件无法访问生命周期的方法 无状态组件只能访问输入的props,无副作用 function Title() { return <h ...

  2. SpringBoot介绍与使用

    SpringBoot介绍与使用 1.什么是SpringBoot SpringBoot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品: 我们可 ...

  3. 关于AWD线下攻防的经验

    备份:     1.备份源码,使用图像化工具连接ssh后,我喜欢用winscp,         找到根目录后,直接右键后台下载就行.           找根目录这里,有时候比赛不给根目录位置,上次 ...

  4. Web 3D是否需要WebAssembly?

    大家好,本文讨论了Web 3D是否需要WebAssembly,结论是: 对于使用原生3D技术的程序员,需要: 对于使用Javascript语言的前端程序员,不需要,有其它方法可以达到接近WebAssd ...

  5. python专题我对json的日常操作

    一前言 本篇文章将会阐述对json的日常操作,如何读取json文件,将json文件转为字典:如何将字典转为json,将字典写入文件等: 二 josn数据格式简要说明 json对于初学者可以理解是一种数 ...

  6. 揭发233的docker/machine

    继手动滑稽之golang-vmware-driver广告篇,今天把vmware-driver完成 然而我却要发一篇牢骚,这是对docker公信力的挑战!!! 本来很简单的升级到vmware 15.x的 ...

  7. Scala与Mongodb实践3-----运算环境的搭建

    目的:使的在IDEA中编辑代码,令代码实现mongodb运算,且转换较为便捷 由实验2可知,运算环境的搭建亦需要对数据进行存储和计算,故需要实现类型转换,所以在实验2的基础上搭建环境. 由菜鸟教程可得 ...

  8. dp - 逆序数序列

    对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数 ...

  9. .net生成荣誉证书

    参考:https://blog.csdn.net/ljk126wy/article/details/84299373 采用生成pdf 方式  效果如下: 用adobe acrobat 制作一个模板  ...

  10. __call__ 方法

    对象() 或 类()() 调用 __call__里面的方法 class Call: def __call__(self, *args, **kwargs): print("Hello __c ...