makefile编译选项CC与CXX/CPPFLAGS,CFLAGS与CXXFLAGS/LDFLAGS

来源:互联网 发布:哪个软件可以群发短信 编辑:程序博客网 时间:2024/06/03 21:25

AR 库文件维护程序的名称。默认值为ar

AS 汇编程序的名称,默认值为as

CC C编译器的名称,默认为cc

CPP C预编译器的名称,默认值为$(CC) -E

CXX C++编译器的名称,默认值为g++

FC   FORTRAN编译器的名称,默认值为f77

ARFLAGS   库文件维护的程序选项,无默认值

ASFLAGS   汇编程序的选项,无默认值

CFLAGS     C编译器的选项,无默认值

CPPFLAGS C预编译的选项,无默认值

CXXFLAGS C++编译器的选项,无默认值

FFLAGS      FORTRAN编译器的选项,无默认值



AR   函数库打包程序,可创建静态库.a文档。默认是"ar"。
AS   汇编程序。默认是"as"。
CC   C编译程序。默认是"cc"。
CXX  C++编译程序。默认是"g++"。
CPP  C/C++预处理器。默认是"$(CC) -E"。
FC   Fortran编译器。默认是"f77"。
PC   Pascal语言编译器。默认是"pc"。
YACC Yacc文法分析器。默认是"yacc"。

 ARFLAGS     函数库打包程序的命令行参数。默认值是"rv"。
ASFLAGS     汇编程序的命令行参数。
CFLAGS      C编译程序的命令行参数。
CXXFLAGS    C++编译程序的命令行参数。
CPPFLAGS    C/C++预处理器的命令行参数。
FFLAGS      Fortran编译器的命令行参数。
PFLAGS      Pascal编译器的命令行参数。
YFLAGS      Yacc文法分析器的命令行参数。
LDFLAGS     链接器的命令行参数。





===================================================================

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

===================================================================



0,arm-linux-gcc -o example example.c
   不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。
    -o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出a.out


1. arm-linux-gcc -c -o example.o example.c
   -c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.o文件
   去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以

2.arm-linux-gcc -S -o example.s example.c
   -S参数将对源程序example.c进行预处理、编译,生成example.s文件
   -o选项同上

3.arm-linux-gcc -E -o example.i example.c
   -E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预处理后的内容打印到屏幕上)
   就是将#include,#define等进行文件插入及宏扩展等操作。
  
4.arm-linux-gcc -v -o example example.c
加上-v参数,显示编译时的详细信息,编译器的版本,编译过程等。

5.arm-linux-gcc -g -o example example.c
-g选项,加入GDB能够使用的调试信息,使用GDB调试时比较方便。

6.arm-linux-gcc -Wall -o example example.c
-Wall选项打开了所有需要注意的警告信息,像在声明之前就使用的函数,声明后却没有使用的变量等。

7.arm-linux-gcc -Ox -o example example.c
-Ox使用优化选项,X的值为空、0、1、2、3
0为不优化,优化的目的是减少代码空间和提高执行效率等,但相应的编译过程时间将较长并占用较大的内存空间。

8.arm-linux-gcc   -I /home/include -o example example.c
-Idirname: 将dirname所指出的目录加入到程序头文件目录列表中。如果在预设系统及当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。

9.arm-linux-gcc   -L /home/lib -o example example.c

-Ldirname:将dirname所指出的目录加入到库文件的目录列表中。在默认状态下,连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后再到系统预设路径中寻找。

10.arm-linux-gcc –static -o libexample.a example.c

静态链接库文件

 

gcc在命令行上经常使用的几个选项是:
-c   只预处理、编译和汇编源程序,不进行连接。编译器对每一个源程序产生一个目标文件。

-o file  确定输出文件为file。如果没有用-o选项,缺省的可执行文件的输出是a.out,目标文件和汇编文件的输出对source.suffix分别是source.o和source.s,预处理的C源程序的输出是标准输出stdout。

-Dmacro 或-Dmacro=defn   其作用类似于源程序里的#define。例如:% gcc -c -DHAVE_GDBM -DHELP_FILE=\"help\" cdict.c其中第一个- D选项定义宏HAVE_GDBM,在程序里可以用#ifdef去检查它是否被设置。第二个-D选项将宏HELP_FILE定义为字符串“help”(由于 反斜线的作用,引号实际上已成为该宏定义的一部分),这对于控制程序打开哪个文件是很有用的。

-Umacro   某些宏是被编译程序自动定义的。这些宏通常可以指定在其中进行编译的计算机系统类型的符号,用户可以在编译某程序时加上 -v选项以查看gcc缺省定义了哪些宏。如果用户想取消其中某个宏定义,用-Umacro选项,这相当于把#undef macro放在要编译的源文件的开头。

-Idir   将dir目录加到搜寻头文件的目录列表中去,并优先于在gcc缺省的搜索目录。在有多个-I选项的情况下,按命令行上-I选项的前后顺序搜索。dir可使用相对路径,如-I../inc等。

-O   对程序编译进行优化,编译程序试图减少被编译程序的长度和执行时间,但其编译速度比不做优化慢,而且要求较多的内存。

-O2   允许比-O更好的优化,编译速度较慢,但结果程序的执行速度较快。

-g   产生一张用于调试和排错的扩展符号表。-g选项使程序可以用GNU的调试程序GDB进行调试。优化和调试通常不兼容,同时使用-g和-O(-O2)选项经常会使程序产生奇怪的运行结果。所以不要同时使用-g和-O(-O2)选项。

-fpic或-fPIC   产生位置无关的目标代码,可用于构造共享函数库。

以 上是gcc的编译选项。gcc的命令行上还可以使用连接选项。事实上,gcc将所有不能识别的选项传递给连接程序ld。连接程序ld将几个目标文件和库程 序组合成一个可执行文件,它要解决对外部变量、外部过程、库程序等的引用。但我们永远不必要显式地调用ld。利用gcc命令去连接各个文件是很简单的,即 使在命令行里没有列出库程序,gcc也能保证某些库程序以正确的次序出现。

gcc的常用连接选项有下列几个:
-Ldir   将dir目录加到搜寻-l选项指定的函数库文件的目录列表中去,并优先于gcc缺省的搜索目录。在有多个-L选项的情况下,按命令行上-L选项的前后顺序搜索。dir可使用相对路径。如-L../lib等。

-lname   在连接时使用函数库libname.a,连接程序在-Ldir选项指定的目录下和/lib,/usr/lib目录下寻找该库文件。在没有使用-static选项时,如果发现共享函数库libname.so,则使用libname.so进行动态连接。

-static   禁止与共享函数库连接。

-shared   尽量与共享函数库连接





















编译选项

1,让我们先看看makefile规则中的编译命令通常是怎么写的

大多书软件包遵守如下的约定俗成的规范

#1,首先从源代码生成目标文件(预处理,编译,汇编)。-c选项表示不执行链接步骤

$(CC) $(CPPFLAGS) $(CFLAGS) example.c   -c   -o example.o -c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.o文件   去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以
arm-linux-gcc -o example example.c
   不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。
    -o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出a.out

arm-linux-gcc -c -o example.o example.c
   -c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.o文件
















========================================================

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++====

=========================================================

CC与CXX

这是C与C++编译器命令。默认值一般是gcc和g++



CFLAGS与CXXFLAGS

CFLAGS表示用于C编译器的选项,CXXFLAGS表示用于C++编译器的选项。

这两个变量实际上涵盖了编译和汇编两个步骤













=====================================================================

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

=====================================================================






ipcrm用来删除一个或更多的消息队列,信号量集或共享内存标识


linux进程间通信---------------使用消息队列

消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法

每个数据块都被认为含有一个类型,接受进程可以独立的接受含有不同类型的数据结构

我们可以通过发送消息来避免命名管道的同步和阻塞问题

但是消息队列和命名管道一样,每个数据块都有一个最大长度限制


它的用法与信号量和共享内存相似


aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

int msgget函数

int   msgget用来创建和访问一个消息队列

int msgsend用来把消息添加到消息队列中










bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

linux进程间 通信-------------使用匿名管道





管道是一个进程连接数据流到另一个进程的通道




linux进程间通信--------------------------使用命名管道













ccccccccccccccccccccccccccccccccccccccccccccccccccccc

匿名管道主要用于本地父进程和子进程之间的通信

在父进程中的话,首先要创建一个匿名管道

在创建匿名管道成功后,可以获取到对这个匿名管道的读写句柄


dddddddddddddddddddddddddddddddd

我们知道管道包括三种

1):普通管道PIPE,通常有很多限制,一是半双工,只能单向传输,二是只能在父子进程间使用

2):流管道:这种能双向传输,但是也是只能父子进程间使用。

3):命名管道,去除了以上的第二种限制,可以在许多不相关的进程间进行通讯。也是半双工的通信方式。




命名管道的使用步骤

服务器端:

1):服务器进程调用CreateNamedPipe函数来创建一个有名称的命名管道在创建命名管道的时候必须指定一个

本地的命名管道名称。windows允许同一个本地的命名管道名称右多个命名管道实例。所以,服务器进程在

调用CreateNamedPipe函数时必须指定最大允许的实例数(0-255).如果CreateNamedPipe函数成功返回后,

服务器进程得到一个指向一个命名管道实例的句柄。

2):服务器进程就可以调用ConnectNamedPipe来等待客户的连接请求,这个ConnectNamedPipe既支持同步形式,

又支持异步形式,若服务器进程以同步形式调用 ConnectNamedPipe函数,如果没有得到客户端的连接请求,则会一

直等到客户端的连接请求。当该函数返回时,客户端和服务器之间的命名管道连接已经建立起来了。

3):这个时候服务器端就可以向客户端读(ReadFile)/写(WriteFile)数据了。

4):在已经建立连接的命名管道实例中,服务器进程就会得到一个指向该管道实例的句柄,这个句柄称之为服务器

端句柄,同时服务端进程可以调用DisconnectNamedPipe函数,将一个管道实例与当前建立连接的客户端进程

断开,从而可以重新连接到新的客户端进程。当然,服务器也可以调用CloseHandle来关闭一个已经建立连接的命名管道实例。