C程序的编译过程

     

常用文件的后缀名:

gcc编译c代码

1、gcc 常用编译选项:

2、gcc编译方法

testc.c:

#include <stdio.h>

int main()
{
    printf("HELLO WORLD!");
    system("pause");
    ;
}

1)一步到位编译为可执行exe程序:

gcc testc.c               ---生成a.exe

gcc testc.c -o testc     ---生成testc.exe

2)先生成目标代码再生成exe程序:

gcc -c testc.c    --先生成testc.o

gcc -o testc.exe testc.o   --再连接testc.o生成testc.exe 
 
 
3)详细分步编译过程:
 
3.1)预处理
gcc -E testc.c -o testc.i 
 
3.2)编译为汇编代码
gcc -S testc.i -o testc.s
 
3.3)汇编
gcc -c testc.s -o testc.o
 
3.4)连接
gcc testc.o -o testc
 
 
4)多个程序文件的编译

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

5)存在include头文件使用库文件的编译:

5.1)编译testc.c为目标文件

gcc –c –I /usr/dev/mysql/include test.c –o test.o

5.2)把所有目标文件链接成可执行文件

gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test

---Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾,windows下为编译dll)和静态链接库(通常以.a结尾,windows下为编译lib),二者区别仅在于程序执行时所需的代码是在运行时动态加载的,还是编译时静态加载的

5.3)强制链接时使用静态链接库

gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test

---默认情况下GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接库

6)检错

gcc -pedantic illcode.c -o illcode          ---pedantic选项能够帮助程序员发现一些不符合 ANSI/ISO C标准的代码,但不是全部

gcc -Wall illcode.c -o illcode             ---Wall选项能够使GCC产生尽可能多的警告信息

gcc -Werror test.c -o test     ---Werror选项使GCC在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改

 

7)Linux下库文件搜索顺序

7.1) 静态库链接时搜索路径顺序:

  1. ld会去找GCC命令中的参数-L
  2. 再找gcc的环境变量LIBRARY_PATH
  3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

7.2) 动态链接时、执行时搜索路径顺序:

  1. 编译目标代码时指定的动态库搜索路径
  2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
  3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
  4. 默认的动态库搜索路径/lib
  5. 默认的动态库搜索路径/usr/lib

7.3) 有关环境变量:

LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径

 
 
3、windows下gcc编译C代码为动态链接库DLL方法
dll.c:
include "dll.h"

void hello(void)
{
    printf("Hello\n");
}

dll.h:

/*
Dll.h有一些技巧性的东西在里面。它检查这个BUILD_DLL宏,当我们编译时将手动设置BUILD_DLL宏,这时候宏EXPORT被设置成__declspec(dllexport),
这样GCC就能编译这个DLL。当从可执行文件中调用DLL时,BUILD_DLL宏没有被设置,EXPORT宏被设置成__declspec(dllimport), 它将使函数在调用范围内可见。
*/

#ifdef BUILD_DLL

/* DLL export */
#define EXPORT __declspec(dllexport)
#else

/* EXE import */
#define EXPORT __declspec(dllimport)
#endif

EXPORT void hello(void);
hello.c:
#include <stdio.h>
#include "dll.h"

int main()
{
   hello();
   system("pause");
   ;
}

1)编译dll.c为目标代码dll.o

gcc -c -DBUILD_DLL dll.c

---DBUILD_DLL来设置宏BUILD_DLL

2)创建DLL

gcc -shared -o message.dll dll.o [-Wl,--out-implib,libmessage.a]

---shared参数用来创建共享库(dll或lib)

---Wl等待下一条信息进行连接

---out-implib是给连接程序ld使用的,用于创建要连接dll需要的import library

3)编译hello.c为目标代码hello.o

gcc -c hello.c

4)生成hello的exe文件

gcc -o hello.exe hello.o -L./ -lmessage

---L 指定连接库路径

---lmessage (or -l message) 指定dll的import library

GCC编译C代码的更多相关文章

  1. ARMCC和GCC编译ARM代码的软浮点和硬浮点问题 【转】

    转自:http://houh-1984.blog.163.com/blog/static/31127834201211112129167/ 本文介绍了ARM代码编译时的软浮点(soft-float)和 ...

  2. ARMCC和GCC编译ARM代码的软浮点和硬浮点问题【转】

    转自:https://blog.csdn.net/hunanchenxingyu/article/details/47003279 本文介绍了ARM代码编译时的软浮点(soft-float)和硬浮点( ...

  3. Linux | GCC如何实现代码编译&&汇编&&链接过程

      正文: 每次我们程序员所写的 代码 是给程序员看的呢?还是给电脑看的?其实我们所写的代码只是我们程序员之间交流的一样特殊语言,电脑是看不懂的.那么我们如何实现人机交流呢?这就不得不请出我们我们今天 ...

  4. 在Ubuntu 16.04 LTS上用g++和gcc编译C/C++代码错误提示“.../x86_64-linux-gnu/crt1.o: ELF section name out of range”

    (有一些图片我是直接从个人的CSDN博客上复制来的) 最近一个多月来,我曾经多次尝试在Ubuntu 16.04 LTS上使用g++和gcc(这俩好像合起来叫MinGW?)来编译C/C++代码,但是在解 ...

  5. gcc编译代码报错及编译方式

    一.error: 'for' loop initial declarations are only allowed in C99 mode 前段时间写了一个小C程序,放在linux下用gcc编译出错, ...

  6. GCC 编译优化指南(转)

    GCC 编译优化指南(转) http://www.jinbuguo.com/linux/optimize_guide.html 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然 ...

  7. gcc编译时头文件和库文件搜索路径

    特殊情况:用户自定义的头文件使用#include"mylib"时,gcc编译器会从当前目录查找头文件 一.头文件 gcc 在编译时寻找所需要的头文件 :    ※搜寻会从-I开始( ...

  8. Linux——【转】gcc编译与gdb调试简要步骤

    原文:gcc编译与gdb调试简要步骤 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定义和include文件展开等工作:(.i) l 根据编译参数进行不同程 ...

  9. gcc编译的四个阶段:预处理,编译,汇编,链接

    1:gcc编译的四个阶段:预处理,编译,汇编,链接 #vi file.c #gcc -E file.c -o file.i//-E查看且预处理后停止编译,-o生成目标文件,-i表示已预处理 #gcc  ...

随机推荐

  1. webstrom配置sass与less

    1.less 安装一个稳定版的node.[例如node-v4.4.4-x64] 然后直接在webstrom里导入那个lessc.cmd 2.sass 安装ruby. 安装完之后点开,Start那个安装 ...

  2. Eclipse 设置SVN忽略文件

    1.在 Eclipse 中点击菜单 window --> Preferences --> Team --> Ignored Resources 2.在Eclipse的导航视图中,选中 ...

  3. nginx配置301重定向

    1. 简介 301重定向可以传递权重,相比其他重定向,只有301是最正式的,不会被搜索引擎判断为作弊 2. 栗子 savokiss.com 301到 savokiss.me 3. nginx默认配置方 ...

  4. 启动Tomcat报异常host-manager does not exist or is not a readable directory

    前几天重新安装了Tomcat6,安装完Tomcat6后在wepapps下面会有一些tomcat自带的项目(root.manager.host- manager等几个),这几天项目没什么用我就删掉了,后 ...

  5. MVC+Easeyui dialog的小问题

    今天在尝试 MVC+Easyui的练习中遇到的一些,小问题. 在.net MVC 中  在_layout.cshtml中设置Easyui 环境  ,在传到子页中,发现$("#dlg" ...

  6. 简单理解Socket

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  7. 算法系列:FFT 003

    转载自https://zhuanlan.zhihu.com/p/19763358 作者:Heinrich 链接:https://zhuanlan.zhihu.com/p/19763358 来源:知乎 ...

  8. android 教程实例系列

    用户界面部分学起来还真是无处下手哇,总不能一个控件发一篇文吧,略有点费时间啊...这个难道不是边用边学才给力吗..所以我打算从最实用的Button开始下手. 先贴几个链接,好东西: android用户 ...

  9. linux 查看Java 进程的内存使用情况

    top -b -n 1 | grep java| awk '{print "PID:"$1",mem:"$6",CPU percent:"$ ...

  10. CodeForces445A DZY Loves Chessboard

    A. DZY Loves Chessboard time limit per test 1 second memory limit per test 256 megabytes input stand ...