gcc条件编译及其它选项

#ifdef和#endif的作用

      一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。

      条件编译命令最常见的形式为:

#ifdef 标识符
程序段1
#else
程序段2
#endif

      它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。 

      其中#else部分也可以没有,即:

#ifdef 程序段1
#denif

#ifndef和#endif的用法

#ifndef x //if not define的简写
#define x
程序段1 //如果x没有被宏定义过,定义x,并编译程序段1
#endif
程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。

      这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。

#ifdef和#if defined的区别

#ifdef和#ifdefined的区别在于,后者可以组成复杂的预编译条件,比如:

#if defined(AAA) && defined(BBB)
xxxxxxxxx
#endif

#if defined(AAA) || VERSION>12
xxxxxxxxx
#endif

而#ifdef就不能用上面的用法,也就是说,当你要判断单个宏是否定义时#ifdef和#ifdefined效果是一样的,但是当你要判断复杂的条件时,只能用#ifdefined。

gcc -D选项

      C语言源程序中有#define定义的宏,可以起到替换、条件编译的功能;定义宏的方式是放在头文件或者C文件中。gcc提供了另外一种宏定义的方法。假设程序需要很多宏,不可能这些宏都在编译器中定义,可以说比较重要的宏才会放在gcc的D选项后边。

-Dname 定义宏name,默认定义内容为字符串“1” 
-Dname=defn 定义宏name,并且内容为defn

#include<stdio.h>  
int main()
{
    #ifdef HELLO
    printf("HELLO defined !\n");
    printf("HELLO = %d\n",HELLO); 
   #else
   printf("HELLO not define!\n");
   #endif 
   return 0;
}

#gcc main.c -o main结果 :HELLO not define!
#gcc -D HELLO main.c -o main结果 :HELLO defined!HELLO = 1
#gcc -D HELLO=36 main.c -o main结果 :HELLO defined!HELLO = 36

      与#define的关系:

-D macro=string,等价于在头文件中定义:#define macro string
-D macro,等价于在头文件中定义:#define macro 1,实际上也达到了定义:#define macro的目的

gcc的参数

1、-l:用来指定程序要链接的库,-l参数紧接着就是库名。那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。

2、-L:跟着的是库文件所在的目录名。比如我们把libtest.so在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest。

3、-I(大写的i):编译程序按照-I指定的路进去搜索头文件。-I/home/include/表示将-I/home/include/目录作为第一个寻找头文件的目录,寻找的顺序是: /home/include/ -->/usr/include-->/usr/local/include。

编译32位程序

运行命令:gcc -v

显示:Target: x86_64-linux-gnu

所以,gcc默认生成64位的程序。如果想编出32位的程序,就要加 -m32选项。且需要安装:

$ sudo apt-get install build-essential module-assistant
$ sudo apt-get install gcc-multilib g++-multilib

猜你喜欢

转载自blog.csdn.net/essity/article/details/78161841