[size=large]先简述下一个c语言项目源码安装的过程
1. ./configure xxxxx
这个过程主要用于生成相应的Makefile,不同的编译选项就会产生不同的makefile.这样以来就可以为不同的CPU(x86? ppc?),机器运行环境,运行参数,安装目录等生成相应的makefile.
2. make
该步骤就是编译
3. make install
该步骤就是为编译的好的可执行文件、配置文件的拷贝。
本文用一个简单的例子简述这个makefile的构成,作为最近学习的总结
本工程文件如下:[/size]
[size=large]这里讲讲全局变量的定义,我个人比较喜欢把全局变量在main.c里面定义,然后再project.h 里面 extern ,所有的其他的.c文件都包含project.h ,如果某个变量只在本文件被使用,可以定义成static 的全局变量,避免其他文件的访问。
所有函数声明都写在.h文件中,例如util.c里面的函数,全部在util.h 里面声明,想调用就直接引用util.h即。
所有的.h 文件最好加上下面这些宏,以免出现重复包含。[/size]
[size=large]OK,来看下我的全能makefile模板吧[/size]
下面是Make.properties
[size=large]CC,就是编译的命令了哦,这里普通的gcc 哦,在ppc就不是这个了啊。一般都做成在./configure 里面选择。
DEFS 是编译的一些选项
LIBS就是我们应用的库,这里我应用的phtread的.so,这个在/usr/lib这个默认目录下是存在的,如果要应用其他路径的.so,请加上-Lxxxx.
INCL 用于加一些额外的头部文件,例如-Ixxxx 默认当然是/usr/include/了。
下面是Makefile文件[/size]
[size=large]COMMONOBJS :这个是将要生成的.o文件,一个.c文件生成一个.o ,也就是说你的工程有几个.c文件,都在这里加上。
TARGET :这个就是你讲要生产的可执行文件,例如httpd等
DEPEND :就是你项目中的.h文件
all: $(TARGET)
这一部将会生成你所需要的可执行文件,makfile和ant一样,$(TARGET)其实就是all的前缀。
[/size]
[size=large]$(TARGET): $(OBJS) $(COMMONOBJS) $(DEPEND)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(COMMONOBJS) $(LIBS)
%.o:%.c
$(CC) $(CFLAGS) -o $@ -c $<
==========
这一块就是变成的具体命令,首先他会执行
%.o:%.c
$(CC) $(CFLAGS) -o $@ -c $<
这一段就会把.c文件生成.o ,下面$@ $< 从上面传下来的参数。
然后就是执行
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(COMMONOBJS) $(LIBS)
即把所有的.o链接成一个可执行文件
本项目具体的执行过程如下
gcc -Wall -g -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -o main.o -c main.c
gcc -Wall -g -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -o util.o -c util.c
gcc -Wall -g -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -o project main.o util.o -lpthread
可以很清楚的看到,首先生成 .o ,然后把.o 链接成可以执行文件
这个makefile虽然不高级,这个工程很简单,但是麻雀虽然小五脏俱全。加上一个configure文件,就算是比较专业的了。至少我经历过的项目都是这样搞的。
文章内容相对比较浅显,作为最近学习的一个总结。
[/size]
1. ./configure xxxxx
这个过程主要用于生成相应的Makefile,不同的编译选项就会产生不同的makefile.这样以来就可以为不同的CPU(x86? ppc?),机器运行环境,运行参数,安装目录等生成相应的makefile.
2. make
该步骤就是编译
3. make install
该步骤就是为编译的好的可执行文件、配置文件的拷贝。
本文用一个简单的例子简述这个makefile的构成,作为最近学习的总结
本工程文件如下:[/size]
main.c //工程主程序
Makefile //makefile文件
Make.properties//makefile的一些编译参数
project.h //用于包含工程中的一些结构体定义,名字一般取项目名称,例如:pppd.h
util.c
util.h
[size=large]这里讲讲全局变量的定义,我个人比较喜欢把全局变量在main.c里面定义,然后再project.h 里面 extern ,所有的其他的.c文件都包含project.h ,如果某个变量只在本文件被使用,可以定义成static 的全局变量,避免其他文件的访问。
所有函数声明都写在.h文件中,例如util.c里面的函数,全部在util.h 里面声明,想调用就直接引用util.h即。
所有的.h 文件最好加上下面这些宏,以免出现重复包含。[/size]
#ifndef __PAGENT_H__
#define __PAGENT_H__
[size=large]OK,来看下我的全能makefile模板吧[/size]
下面是Make.properties
CC = gcc -Wall -g
DEFS = -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE
LIBS = -lpthread
INCL =
CFLAGS = $(DEFS) $(INCL)
[size=large]CC,就是编译的命令了哦,这里普通的gcc 哦,在ppc就不是这个了啊。一般都做成在./configure 里面选择。
DEFS 是编译的一些选项
LIBS就是我们应用的库,这里我应用的phtread的.so,这个在/usr/lib这个默认目录下是存在的,如果要应用其他路径的.so,请加上-Lxxxx.
INCL 用于加一些额外的头部文件,例如-Ixxxx 默认当然是/usr/include/了。
下面是Makefile文件[/size]
include Make.properties
COMMONOBJS = util.o
OBJS = main.o
TARGET = project
DEPEND = project.h util.h
.PHONY: install clean
all: $(TARGET)
$(TARGET): $(OBJS) $(COMMONOBJS) $(DEPEND)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(COMMONOBJS) $(LIBS)
%.o:%.c
$(CC) $(CFLAGS) -o $@ -c $<
install:
-cp -af project /sbin/
clean:
rm -rf $(OBJS) $(TARGET) $(COMMONOBJS)
[size=large]COMMONOBJS :这个是将要生成的.o文件,一个.c文件生成一个.o ,也就是说你的工程有几个.c文件,都在这里加上。
TARGET :这个就是你讲要生产的可执行文件,例如httpd等
DEPEND :就是你项目中的.h文件
all: $(TARGET)
这一部将会生成你所需要的可执行文件,makfile和ant一样,$(TARGET)其实就是all的前缀。
[/size]
[size=large]$(TARGET): $(OBJS) $(COMMONOBJS) $(DEPEND)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(COMMONOBJS) $(LIBS)
%.o:%.c
$(CC) $(CFLAGS) -o $@ -c $<
==========
这一块就是变成的具体命令,首先他会执行
%.o:%.c
$(CC) $(CFLAGS) -o $@ -c $<
这一段就会把.c文件生成.o ,下面$@ $< 从上面传下来的参数。
然后就是执行
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(COMMONOBJS) $(LIBS)
即把所有的.o链接成一个可执行文件
本项目具体的执行过程如下
gcc -Wall -g -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -o main.o -c main.c
gcc -Wall -g -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -o util.o -c util.c
gcc -Wall -g -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -o project main.o util.o -lpthread
可以很清楚的看到,首先生成 .o ,然后把.o 链接成可以执行文件
这个makefile虽然不高级,这个工程很简单,但是麻雀虽然小五脏俱全。加上一个configure文件,就算是比较专业的了。至少我经历过的项目都是这样搞的。
文章内容相对比较浅显,作为最近学习的一个总结。
[/size]