GCC编译C代码
2015-07-05 19:11
267 查看
C程序的编译过程
常用文件的后缀名:
gcc编译c代码
1、gcc 常用编译选项:
2、gcc编译方法
testc.c:
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) 静态库链接时搜索路径顺序:
ld会去找GCC命令中的参数-L
再找gcc的环境变量LIBRARY_PATH
再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
7.2) 动态链接时、执行时搜索路径顺序:
编译目标代码时指定的动态库搜索路径
环境变量LD_LIBRARY_PATH指定的动态库搜索路径
配置文件/etc/ld.so.conf中指定的动态库搜索路径
默认的动态库搜索路径/lib
默认的动态库搜索路径/usr/lib
7.3) 有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径
3、windows下gcc编译C代码为动态链接库DLL方法
dll.c:
dll.h:
hello.c:
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、gcc 常用编译选项:
2、gcc编译方法
testc.c:
#include <stdio.h> int main() { printf("HELLO WORLD!"); system("pause"); return 0; }
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) 静态库链接时搜索路径顺序:
ld会去找GCC命令中的参数-L
再找gcc的环境变量LIBRARY_PATH
再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
7.2) 动态链接时、执行时搜索路径顺序:
编译目标代码时指定的动态库搜索路径
环境变量LD_LIBRARY_PATH指定的动态库搜索路径
配置文件/etc/ld.so.conf中指定的动态库搜索路径
默认的动态库搜索路径/lib
默认的动态库搜索路径/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"); return 0; }
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
相关文章推荐
- 使用java进行视频文件拼接
- C++ 函数对象
- 2015070505 - EffactiveJava笔记 - 第64条 努力保持失败原子性
- Java 异常处理:finally,return
- ASP.NET快速学习方案(.NET菜鸟的成长之路)
- Eclipse在线安装SVN
- xml编程
- java中为什么要使用接口?
- 【python】为什么用python
- Java之内部类
- C# 调用 Outlook发送邮件实例
- java模板方法模式
- 【java】单例模式涉及的多线程问题
- 谈谈你对流行框架的理解(
- Ubuntu运行myeclipse××××.run文件失效!!!
- CXF整合Spring配置文件
- thinkphp-----1
- c++ primer读书笔记-第八章 标准IO库
- 【学习笔记】【C语言】static和extern对变量的作用
- thinkphp