代码改变世界

GCC 常用参数含义

2016-05-29 16:13  慢跑的小菜  阅读(1802)  评论(0编辑  收藏  举报

-ansi

  关闭 gnu c 中与 ansi c 不兼容的特性 , 激活 ansi c 的专有特性 ( 包括禁止一

  些 asm inline typeof 关键字 , 以及 UNIX,vax 等预处理宏

-lxx

    表示动态加载libxx.so库

-Lxx

    表示增加目录xx,让编译器可以在xx下寻找库文件

-Ixx

   表示增加目录xx,让编译器可以在xx下寻找头文件

优化选项

-shared

    生成共享目标文件。通常用在建立共享库时

-Wall

    生成所有警告信息。一下是具体的选项,可以单独使用

 

简单的GCC语法:

如果你只有一个文件(或者只有几个文件),那么就可以不写Makefile文件(当然有Makefile更加方便),用gcc直接编译就行了。在这里我们只介绍几个我经常用的几个参数,第一是 “-o”,它后面的参数表示要输出的目标文件,再一个是 “-c”,表示仅编译(Compile),不连接(Make),如果没有”-c”参数,那么就表示连接,如下面的几个命令:

gcc –c test.c,表示只编译test.c文件,成功时输出目标文件test.o

gcc –c test.c –o test.o ,与上一条命令完全相同

gcc –o test test.o,将test.o连接成可执行的二进制文件test

gcc –o test test.c,将test.c编译并连接成可执行的二进制文件test

gcc test.c –o test,与上一条命令相同

gcc –c test1.c,只编译test1.c,成功时输出目标文件test1.o

gcc –c test2.c,只编译test2.c,成功时输出目标文件test2.o

gcc –o test test1.o test2.o,将test1.o和test2.o连接为可执行的二进制文件test

gcc –c test test1.c test2.c,将test1.o和test2.o编译并连接为可执行的二进制文件test

注:如果你想编译cpp文件,那么请用g++,否则会有类似如下莫名其妙的错误:

cc3r3i2U.o(.eh_frame+0x12): undefined reference to `__gxx_personality_v0’......

还有一个参数是”-l”参数,与之紧紧相连的是表示连接时所要的链接库,比如多线程,如果你使用了pthread_create函数,那么你就应该在编译语句的最后加上”-lpthread”,”-l”表示连接,”pthread”表示要连接的库,注意他们在这里要连在一起写,还有比如你使用了光标库curses,那么呢就应该在后面加上”-lcurses”,比如下面的写法:

gcc –o test test1.o test2.o –lpthread –lcurses

 

例如: 在ubuntu 环境下编译基于course库函数的程序时,如果不带 -lncurses时,会出现

screen1.c:(.text+0x12):对‘initscr’未定义的引用
screen1.c:(.text+0x24):对‘wmove’未定义的引用
screen1.c:(.text+0x39):对‘printw’未定义的引用
screen1.c:(.text+0x4a):对‘wrefresh’未定义的引用
screen1.c:(.text+0x5f):对‘endwin’未定义的引用
需使用 gcc -o screen1 screen1.c -lncurses