导航:首页 > 源码编译 > phony编译器

phony编译器

发布时间:2022-05-18 20:20:49

‘壹’ 怎样写个makefile 文件编译hello.c

以下是一个最简单的多文件+makefile的形式
编译采用gcc 你可以修改成你的编译器

三个文件 main.c func.c makefile
main.c

1
2
3
4
5
6
7

#include <stdio.h>
extern void func();//这个应该放在头文件中的 比如func.h 简单起见 就直接声明了

int main()
{
func();
}

func.c

1
2
3
4
5
6

#include <stdio.h>

void func()
{
printf("hello world\n");
}

makefile

1
2
3
4
5
6
7
8

.PHONY: all main.o func.o

all: main.o func.o
@gcc main.o func.o -o out
main.o: main.c
@gcc -c main.c -o main.o
func.o: func.c
@gcc -c func.c -o func.o

‘贰’ 需要一个编译多个c文件的makefile

#$Id:Makefile,v2.02008/10/0818:55:40Update$
prog_name=TEST#目标文件名
######################################
#
#Genericmakefile
#
#byJackieXie
#email:[email protected]
#
#Copyright(c)2008JackieXie
#Allrightsreserved.
#
#Nowarranty,noliability;
#youusethisatyourownrisk.
#
#Youarefreetomodifyand
#distributethiswithoutgiving
#credittotheoriginalauthor.
#
######################################
###Customising
#
#Adjustthefollowingifnecessary;EXECUTABLEisthetarget
#executable"sfilename,
#(e.g.alleg,stdcx,iostr,etc).Youcanoverridetheseonmake"s
#commandlineofcourse,ifyouprefertodoitthatway.
#
EXECUTABLE:=$(prog_name)
LIBS:=#库文件没有可不写
#Nowalteranyimplicitrules"variablesifyoulike,e.g.:
#
CFLAGS:=-g-Wall-O
CXXFLAGS:=$(CFLAGS)
CC:=gcc#编译器
#
#directory;ifnotitusesdelinstead,butthiscancause(harmless)
#`Filenotfound"errormessages.IfyouarenotusingDOSatall,
#
#files.
#
ifneq($(wildcard$(DJDIR)/bin/rm),)
RM-F:=rm-f
else
RM-F:=del
endif
#Youshouldn".
#
#...................
SOURCE:=$(wildcard*.cpp)$(wildcard*.c)
OBJS:=$(patsubst%.cpp,%.o,$(patsubst%.c,%.o,$(SOURCE)))
DEPS:=$(patsubst%.o,%.d,$(OBJS))
MISSING_DEPS:=$(filter-out$(wildcard$(DEPS)),$(DEPS))
MISSING_DEPS_SOURCES:=$(wildcard$(patsubst%.d,%.cpp,$(MISSING_DEPS))$(patsubst%.d,%.cpp,$(MISSING_DEPS)))
CPPFLAGS+=-MD
.PHONY:
everything:$(EXECUTABLE)
deps:$(DEPS)
objs:$(OBJS)
clean:
@$(RM-F)*.o
@$(RM-F)*.d

veryclean:clean
@$(RM-F)$(EXECUTABLE)
@$(RM-F)*.*~*~
distclean:veryclean
rebuild:verycleaneverything
ifneq($(MISSING_DEPS),)
$(MISSING_DEPS):
@$(RM-F)$(patsubst%.d,%.o,$@)
endif
-include$(DEPS)

$(EXECUTABLE):$(OBJS)
$(CC)-o$(EXECUTABLE)$(OBJS)$(addprefix,$(LIBS))


复制,保存为makefile 文件即可。

‘叁’ 用一个makefile编译出多个文件

使用 .PHONY, 使用方法见下面描述或参考链接. 经过测试可行.
---------
phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
这样,使用"make"将可以将三个程序都生成了。d
当一个phony 目标是另一个的依赖,其作用相当于子程序,例如:
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff
----------
我测试的Makefile:
OBJS=main.o sub.o

all : test sam
.PHONY:all
test : $(OBJS)
gcc -o test $(OBJS)
sam : sam.o
gcc -o sam sam.o

main.o : main.c sub.h
gcc -c main.c
sub.o : sub.c sub.h
gcc -c sub.c

sam.o : sam.c
gcc -c sam.c

‘肆’ 如何编译一个linux下的驱动模块

首先,我们要了解一下模块是如何别被构造的。模块的构造过程与用户空间
的应用程序的构造过程有显着不同;内核是一个大的、独立的程序
,
对于它的各
个部分如何组合在一起有详细的明确的要求。
Linux2.6
内核的构造过程也与以
前版本的内核构造过程不同;
新的构造系统用起来更加简单,
并且可产生更加正
确的结果
,
但是它看起来和先前的方法有很大不同。内核的构造系统非常复杂
,
我们所看到的只是它的一小部分。
如果读者想了解更深入的细节,
则应阅读在内
源码中的
Document/kbuild
目录下的文件。

在构造内核模块之前,
有一些先决条件首先应该得到满足。
首先,
读者要保证你
有适合于你的内核版本的编译器、模块工具
,
以及其他必要工具。在内核文档目
录下的文件
Documentation/Changes
里列出了需要的工具版本;
在开始构造内
核前,
读者有必要查看该文件,
并确保已安装了正确的工具。
如果用错误的工具
版本来构造一个内核
(
及其模块
)
,可能导致许多奇怪的问题。另外也要注意
,
使
用太新版本的编译器偶尔可能也会导致问题。

一旦做好了上面的准备工作之后
,
其实给自己的模块创建一个
makefile
则非常
简单。实际上
,
对于本章前面展示的
" hello world"
例子
,
下面一行就够了
:
obj-m := hello.o
如果读者熟悉
make

但是对
Linux2.6
内核构造系统不熟悉的话
,
可能奇怪这个
makefile
如何工作。毕竟上面的这一行不是一个传统的
makefile
的样子。问
题的答案当然是内核构造系统处理了余下的工作。上面的赋值语句
(
它利用了由
GNU make
提供的扩展语法
)
说明有一个模块要从目标文件
hello.o
构造,而从
该目标文件构造的模块名称为
hello.ko.
如果我们想由两个源文件
(
比如
file1.c

file2.c )
构造出一个名称为
mole.ko
的模块
,
则正确的
makefile
可如下编写
:
obj-m := mole.o
mole-objs := file1.o file2.o
为了让上面这种类型的
makefile
文件正常工作
,
必须在大的内核构造系统环境
中调用他们。假设读者的内核源码数位于
~/kernel-2.6
目录
,
用来建立你的模
块的
make
命令
(
在包含模块源代码和
makefile
的目录下键入
)
应该是
:
make -C ~/kernel-2.6 M=`pwd` moles
这个命令首先是改变目录到用
-C
选项指定的位置
(
即内核源代码目录
)
,其中保
存有内核的顶层
makefile
文件。这个
M=
选项使
makefile
在构造
moles

标前
,
返回到模块源码目录。
然后,
moles
目标指向
obj-m
变量中设定的模块,
在上面的例子里,我们将该变量设置成了
mole.o


上面这样的
make
命令对于多个文件的编译显得不是很方便
,
于是内核开发者就
开发了一种
makefile
方式
,
这种方式使得内核树之外的模块构造变得更加容易。
代码清单
1.4
展示了
makefile
的编写方法:

代码清单
1.4 makefile
ifeq ($(KERNELRELEASE),)

KERNELDIR ?= /source/linux-2.6.13
PWD := $(shell pwd)

moles:
$(MAKE) -C $(KERNELDIR) M=$(PWD) moles

moles_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) moles_install

clean:
rm -rf *.o *~ core .depend .*. *.ko *.mod.c .tmp_versions

.PHONY: moles moles_install clean

else
obj-m := hello.o
endif
我们再次看到了扩展的
GNU
make
语法在起作用。在一个典型的构造过程中,这

makefile
将被读取两次。当从命令行中调用这个
makefile ,
它注意到
KERNELRELEASE
变量尚未设置。我们可以注意到,已安装的模块目录中存在一
个符号连接,
它指向内核的构造树,
这样这个
makefile
就可以定位内核的源代
码目录。如果读者时间运行的内核并不是要构造的内核,则可以在命令行提供
KERNELDIR=
选项或者设置
KERNELDIR
环境变量
,
或者修改
makefile
中设置
KERNELDIR
的那一行。在找到内核源码树
,
这个
makefile
会调用
default:


,
这个目标使用先前描述过的方法第二次运行
make
命令
(
注意,在这个
makefile

make
命令被参数化成
$(MAKE))
,以便运行内核构造系统。在第二
次读取
makefile
时,
它设置了
obj-m,
而内核的
makefile
负责真正构造模块。

这种构造模块的机制看起来很繁琐,可是,一旦我们习惯了使用这种机制
,
则会
欣赏内核构造系统带给我们的便利。需要注意的是
,
上面
makefile
并不完整,
一个真正的
makefile
应包含通常用来清除无用文件的目标
,
安装模块的目标等
等。一个完整的例子可以参考例子代码目录的
makefile

‘伍’ linux用gcc编译

运行结果我不给了,自己看:
直接编译:
gcc main.c compute.c input.c -o power
运行程序
./power
makefile 最简单,直观的的编写方法:
power:main.o compute.o input.o
cc main.o compute.o input.o -o power
main.o:main.c main.h compute.h input.h
cc -c main.c

compute.o:compute.c compute.h
cc -c compute.c
input.o:input.c input.h
cc -c input.c
.PHONY : clean
clean :
rm -f *.o power

保存后成makefile或Makefile推荐使用后者:
make
想重新编译前运行:
make clean
make
运行程序:
./power
特别说明:cc,rm命令行前有一个tab符,别搞错了。cc 在linux上是指向gcc的软符号链接,为了兼容其他系统,我们写的cc。
makefile有更简写但不简单的写法,不给出来。你提问这个说明你不会编写makefile,给出的是最基本用法。有兴趣自己看,一天能学完。

‘陆’ 如何用一个makefile编译多个目标

使用 .PHONY, 使用方法见下面描述或参考链接. 经过测试可行.
---------
phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
这样,使用"make"将可以将三个程序都生成了。d
当一个phony 目标是另一个的依赖,其作用相当于子程序,例如:
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff

‘柒’ cygwin下安装pycrypto时,出现GCC编译错误,求教

交叉编译工具链作为嵌入式Linux开发的基础,直接影响到嵌入式开发的项目进度和完成质量。由于目前大多数开发人员使用Windows作为嵌入式开发的宿主机,在Windows中通过安装VMware等虚拟机软件来进行嵌入式Linux开发,这样对宿主机的性能要求极高。Cygwin直接作为Windows下的软件完全能满足嵌入式Linux的开发工作,对硬件的要求低及方便快捷的特点成为嵌入式开发的最佳选择。目前网络上Cygwin下直接可用的交叉编译器寥寥无几且版本都比较低,不能满足开源软件对编译器版本依赖性的要求(如低版本工具链编译U-Boot出现软浮点问题等);Crosstool等交叉工具链制作工具也是更新跟不上自由软件版本的进度;同时系统介绍Cygwin下制作交叉编译器方面的资料很少。针对上述情况,基于最新版gcc等自由软件构建Cygwin下的交叉编译器显得尤为迫切和重要。构建前准备工作首先Cygwin下必须保证基本工具比如make}gcc等来构建bootstrap-gcc编译器,这可以在安装Cygwin时选择安装。参照gcc等安装说明文档来在Cygwin下查看是否已经安装,如输入gcc--v等。源码下载gcc-4.5.0的编译需mpc的支持,而mpc又依赖gmp和mpfr库。从各个项目官方网站上下载的最新的源码:binutils-2.20.l.tar.bz2gmp-S.O.l.tar.bz2mpc-0.8.2.tar.gzmpfr-3.O.O.tar.bz2gcc-4.S.O.tar.bz2linux-2.6.34.tar.bz2glibc-2.11.2.tar.bz2glibc-ports-2.ll.tar.bz2gdb-7.l.tar.bz2设置环境变量HOST:工具链要运行的目标机器;BUILD:用来建立工具链的机器;TARGET工具链编译产生的二进制代码可以运行的机器。BUILD=i686-pc-cygwinHOST=i686-pc-cygwinTARGET=arm-linuxSYSROOT指定根目录,$PREFIX指定安装目录。目标系统的头文件、库文件、运行时对象都将被限定在其中,这在交叉编译中有时很重要,可以防止使用宿主机的头文件和库文件。本文首选$SYSROOT为安装目录,$PREFIX主要作为glibc库安装目录。SYSROOT=/cross-rootPREFIX=/cross-root/arm-linux由于GCC-4.5.0需要mpfr,gmp,mpc的支持,而这三个库又不需要交叉编译,仅仅是在编译交叉编译链时使用,所以放在一个临时的目录。TEMP_PREFIX=/build-temp控制某些程序的本地化的环境变量:LCALL=POSIX设置环境变量:PATH=$SYSROOT/bin:儿in:/usr/bin设置编译时的线程数f31减少编译时间:PROCS=2定义各个软件版本:BINUTILSV=2.20.1GCCV=4.5.0GMPV=5.0.1MPFRV=3.0.0MPCV二0.8.2LINUXV二2.6.34GLIBCV=2.11.2GLIBC-PORTSV=2.11GDBV=7.1构建过程详解鉴于手工编译费时费力,统一把构建过程写到Makefile脚本文件中,把其同源码包放在同一目录下,执行make或顺次执行每个命令即可进行无人值守的编译安装交叉工具链。以下主要以Makefile执行过程为主线进行讲解。执行“make”命令实现全速运行可在Cygwin的Shell环境下执行“make>make.log2>&1”命令把编译过程及出现的错误都输出到make.log中,便于查找:all:prerequestinstall-depsinstall-cross-stage-oneinstall-cross-stage-two预处理操作"makeprerequest',命令实现单步执行的第一步,实现输出变量、建立目录及解压源码包等操作。0'set十h”关闭bash的Hash功能,使要运行程序的时候,shell将总是搜索PATH里的目录[4]。这样新工具一旦编译好,shell就可以在$(SYSROOT)/bin目录里找到:prerequest:set+h&&mkdir-p$(SYSROOT)/bin&&mkdir-p$(PREFIX)/include&&mkdir-p$(TEMP一REFIX)&&exportPATHLCesALL&&tar-xvfgmp-$(GMP_V).tar.bz2&&tar-xvfmpfr-$(MPFR_V).tar.bz2&&tar-xvfmpc-$(MPC_V).tar.gz&&tar-xvfbinutils-$(BINUTILS_V).tar.bz2&&tar-xvfgcc-$(GCC_V).tar.bz2&&tar-xvflinux-$(LINUX_V).tar.bz2&&tar-xvfglibc-$(GLIBC_V).tar.bz2&&tar-xvfglibc-ports-$(GLIBC-PORTS_V).tar.bz2&&myglibc-ports-$(GLIBC-PORTS_V)glibc-$(GLIBC_V)/ports&&tar-xvfgdb-$(GDBV).tar.bz2非交叉编译安装gcc支持包mpc00makeinstall-deps”命令实现单步执行的第二步,实现mpc本地编译,mpc依赖于gmp和mpfrinstall-deps:gmpmpfrmpcgmp:gmp-$(GMP_V)mkdir-pbuild/gmp&&cdbuild/gmp&&../../gmp-*/configure--disable-shared--prefix=$(TEMP_PREFIX)&&$(MAKE)一$(PROCS)&&$(MAKE)installmpfr:mpfr-$(MPFR_V)mkdir-pb-uild/mpfr&&cdbuild/mpfr&&../..//mpfr-*/configureLDF'LAGS="-Wl,-search_paths_first”--disable-shared--with-gmp=$(TEMP_PREFIX)--prefix=$(TEMP_PREFIX)&&$(MAKE)一$(PROCS)all&&$(MAKE)installmpc:mpc-$(MPC_V)gmpmpfrmkdir-pbuild/mpc&&cdbuild/mpc&&../../mpc-*/configure--with-mpfr=$(TEMPPREFIX)--with-gmp=$(TEMP_PREFIX)--prefix=$(TEMP_PREFIX)&&$(MAKE)一$(PROCS)&&$(MAKE)install交叉编译第一阶段"makeinstall-cross-stage-one',命令实现单步执行的第三步,编译安装binutils,bootstrap-gcc和获取Linux内核头文件:install-cross-stage-one:cross-binutilscross-gccget-kernel-headers编译安装binutilscross-binutils:binutils-$(BINUTILS_V)mkdir-pbuild/binutils&&cdbuild/binutils&&../..//binutils-*/configure--prefix=$(SYSROOT)--target=$(TARGET)--disable-nls&&$(MAKE)j$(PROCS)&&$(MAKE)install编译安装bootstrap-gcc。使用一disable-shared参数的意思是不编译和安装libgcc_eh.a文件。glibc软件包依赖这个库,因为它使用其内部的一lgcc_eh来创建系统[6]。这种依赖性,可通过建立一个指向libgcc.a符号链接得到满足,因为该文件最终将含有通常在libgcc-eh.a中的对象(也可通过补丁文件实现)。cross-gcc:gcc-$(GCC_V)mkdir-pbuild/gcc&&cdbuild/gcc&&二//gcc-*/configure--target=$(TARGET)--prefix=$(SYSROOT)--disable-nls--disable-shared--disable-multilib--disable-decimal-float--disable-threads--disable-libmudflap--disable-libssp--disable-libgomp--enable-languages=c--with-gmp=$(TEMP_PREFIX)--with-mpfr=$(TEMP_PREFIX)--with-mpc=$(TEMP_PREFIX)&&$(MAKE)-j$(PROCS)&&$(MAICE)install&&In-vslibgcc.a'arm-linux-gcc-print-libgcc-file-nameIsed's/libgcc/&eh/'}获取Linux内核头文件:get-kernel-headersainux-$(LINUX_V)cdlinux-$(LINUX_V)&&$(MAICE)mrproper&&$(MAKE)headerscheck&&$(MAKE)ARCH=arm&&INSTALLesHDR_PATH=destheaders_install&&finddest/include(-name.install一。-name..installNaNd)-delete&&cp-rvdesdinclude/*$(PREFIX)/include交叉编译第二阶段编译安装glibc、重新编译安装binutils、完整编译安装gcc和编译安装gdbo"makeinstall-cross-stage-two',命令实现单步执行的第四步:install-cross-stage-two:cross-glibccross-rebinutilscross-g++cross-gdb编译安装glibcaglib。的安装路径特意选为$(PREFIX),与gcc更好找到动态链接库也有关系,选在$(SYSROOT)提示找不到crti.o;glibc已经不再支持i386;glibc对ARM等的处理器的支持主要通过glibc-ports包来实现;正确认识大小写敏感(CaseSensitive)和大小写不敏感(CaseInsensitive)系统,大小写敏感问题主要影响到glibc,是交叉编译glibc成功的关键:Cygwin帮助手册中可知Cygwin是默认大小写不敏感的n},但是UNIX系统是大小写敏感的,这也是Cygwin和UNIX类系统的一个区别。通过作者自行参考制作的glibc-2.11.2-cygwin.patch补T使glibc变为Case-Insensitive,此补丁主要是对大小写敏感问题改名来实现。交叉编译过程中安装的链接器,在安装完Glibc以前都无法使用。也就是说这个配置的forcenwind支持测试会失败,因为它依赖运行中的链接器。设置libc_cvforcenwind=yes这个选项是为了通知configure支持force-unwind,而不需要进行测试。libccv_c_cleanup=yes类似的,在configure脚本中使用libc_cv_ccleanup=yes,以便配置成跳过测试而支持C语言清理处理。cross-glibc:glibc-$(GLIBC_V)cdglibc-$(GLIBC_V)&&patch-Np1–i//glibc-2.11.2-cygwin.patch&&cd..&&mkdir-pbuild/glibc&&cdbuild/glibc&&echo"libccv_forcedesunwind=yes">config.cache&&echo"libccv_c_cleanup=yes">>config.cache&&echo"libccv_arm_tls=yes">>config.cache&&../../glibc-*/configure--host=$(TARGET)--build=$(../OneScheme/glibc-2.11.2/scripts/config.guess)--prefix=$(PREFIX)--disable-profile--enable-add-ons--enable-kernel=2.6.22.5--with-headers=$(PREFIX)/include--cache-file=config.cache&&$(MAKE)&&$(MAKE)install重新编译安装binutils。编译之前要调整工具链,使其指向新生成的动态连接器。调整工具链:SPECS='dirname$(arm-linux-gcc-print-libgcc-file-name)'/specsarm-linux-gcc-mpspecssed-e's@/lib(64)\?/ld@$(PREFTX)&@g'-e,}/}}*cPP}$/{n;s,$,-isystem$(PREFIX)/include,}">$SPECSecho"Newspecsfileis:$SPECS"unsetSPECS测试调整后工具链:echo'main(川’>mmy.carm-linux-gcc-B/cross-root/arm-linux/libmmy.creadelf-1a.outIgrep’:/cross-roobarm-linux'调整正确的输出结果:[Requestingprograminterpreter:/tools/lib/ld-linux.so.2j一切正确后删除测试程序:rm-vmmy.ca.out重新编译binutils。指定--host,--build及--target,否则配置不成功,其config.guess识别能力不如gcc做的好。cross-rebinutils:binutils-$(BINUTILS_V)mkdir-pbuild/rebinutils&&cdbuild/rebinutils&&CC="$(TARGET)-gcc-B/cross-roodarm-linux/lib/"&&AR=$(TARGET)-ar&&RANLIB=$(TARGET)-ranlib&&../..//binutils-*/configure--host=$(HOST)--build=$(BUILD)--target=$(TARGET)--prefix=$(SYSROOT)--disable-nls--with-lib-path=$(PREFIX)/lib&&$(MAKE)--$(PROCS)&&$(MAKE)install高于4.3版的gcc把这个编译当作一个重置的编译器,并且禁止在被一prefix指定的位置搜索startfiles。因为这次不是重置的编译器,并且$(SYSROOT)目录中的startfiles对于创建一个链接到$$(SYSROOT)目录库的工作编译器很重要,所以我们使用下面的补丁,它可以部分还原gcc的老功能tai.patch-Npl–i../gcc-4.5.0-startfiles_fix-l.patch在正常条件下,运行gcc的fixincludes脚本,是为了修复可能损坏的头文件。它会把宿主系统中已修复的头文件安装到gcc专属头文件目录里,通过执行下面的命令,可以抑制fixincludes脚本的运行[9](此时目录为/gcc-4.5.0)。cp-vgcc/Makefile.in{,.orig}sed's@\./fixinc\.sh@-ctrue@'gcc/Makefile.in.orig>gcc/Makefile.in下面更改gcc的默认动态链接器的位置,使用已安装在/cross-root/ann-linux目录下的链接器,这样确保在gcc真实的编译过程中使用新的动态链接器。即在编译过程中创建的所有二进制文件,都会链接到新的glibc文件forfilein$(findgcc/config-namelinux64.h-o-namelinux.h–o-namesysv4.h)docp-uv$file{,.orig}sed-a's@/lib(64)?(32)?/Id@/cross-root/arm-linux&@g’-e's@/usr@/cross-rootlarm-linux@g'$file.orig>$fileecho‘#undefSTANDARDINCLUDEDIR#defineSTANDARD_INCLUDEDIR"/cross-root/arm-linux/include"#"/cross-root/arm-linux/lib"#defineSTANDARD_STARTFILE_PREFIX_2””’>>$filetouch$file.origdone完整编译安装gcc。最好通过指定--libexecdir更改libexecdir到atm-linux目录下。--with-local-prefix选项指定gcc本地包含文件的安装路径此处设为$$(PREFIX),安装后就会在内核头文件的路径下。路径前指定$(Pwd)则以当前路径为基点,不指定则默认以/home路径为基点,这点要注意。cross-g++:gcc-$(GCC-)mkdir-pbuild/g十+&&cdbuild/g++&&CC="$(TARGET)-gccAR=$(TARGET)-ar&&-B/cross-roodarm-linux/lib/"&&RANLIB=$(TARGET)-ranlib&&..//gcc-*/configure--host=$(HOST)--build=$(BUILD)--target=$(TARGET)--prefix=$(SYSROOT)--with-local-prefix=$(PREFIX)--enable-clocale=gnu--enable-shared--enable-threads=posix--enable-cxa_atexit--enable-languages=c,c++--enable-c99--enable-long-long--disable-libstdcxx-pch--disable-libunwind-exceptions--with-gmp=$(TEMP_PREFIX)--with-mpfr=$(TEMP_PREFIX)--with-mpc=$(TEMP_PREFIX)&&$(MAKE)LD_IBRARY_ATH=$(pwd)/$(../../gcc-4.5.0/config.guess)/libgcc&&$(MAKE)install编译安装gdb,至此完成整个工具链的制作。cross-gdb:gdb-$(GDBV)mkdir-pbuild/gdb&&cdbuild/gdb&&../../gdb-*/configure--prefix=$(SYSROOT)--target=$(TARGET)--disable-werror&&$(MAKE)-j$(PROCS)&&$(MAKE)install“makeclean”命令清除编译生成的文件和创建解压的文件夹.PHONY:cleandean:rm-fr$(TEMP_PREFIX)buildbinutils-$(BINUTIL,S_V)gcc-$(GCC_V)glibc-$(NEWL.IB_V)gdb-$(GDB_V)gmp-$(GMP_V)mpc-$(MPC_V)mpfr-$(MPFR_V)工具链测试命令行中输入以下内容:echo'main(){}’>mmy.carm-linux-gcc-ommy.exemmy.cfilemmy.exe运行正常的结果:mmy.exe:ELF32-bitLSBexecutable,ARM,version1,forGNU/Linux2.6.22,dynamicallylinked(usessharedlibs),notstripped.

‘捌’ gcc 编译多文件批处理文件

CC= gcc
CFLAGS= -O2 -g -Wall
LIBS= -lsqlite3
LIB_DIR= -L../sqlite3/lib/
INCLUD_DIR= -I../sqlite3/include

test:test.c
$(CC) $^ $(CFLAGS) -o $@ \
$(LIBS) $(INCLUD_DIR) $(LIB_DIR)

.PHONY:clean

clean:
-rm test
1.解释:编译器是gcc(可选)
2.CFLAGS= -O2 -g -Wall 是gcc的参数 -O2优化,-g 加调试信息, -Wall(警告)---CFLAGS项可选
3.LIBS= -lsqlite3(库名)有就写没有就不要写,一般的库编译器自己去系统找,特殊的库要自己加。如:pthread线程库。
4.LIB_DIR= -L../sqlite3/lib/,指定库的路径
5.INCLUD_DIR= -I../sqlite3/include,指定头文件的路径.(I是大写的i)
6.
test:test.c
$(CC) $^ $(CFLAGS) -o $@ \
$(LIBS) $(INCLUD_DIR) $(LIB_DIR)
展开就是:gcc -O2 -g -Wall -o test -L../sqlite3/lib/ -I../sqlite3/include

针对你的问题:

先进你的A文件夹
all:test.o

cc *.o -I../B/include/(写绝对路径)

%*.o:%*.c

‘玖’ 大家来帮我看看怎样写一个这样的Makefile文件,通过Makefile文件编译这个多文件的C语言程序

以下是一个最简单的多文件+makefile的形式

编译采用gcc 你可以修改成你的编译器


三个文件 main.c func.c makefile

main.c

#include<stdio.h>
externvoidfunc();//这个应该放在头文件中的比如func.h简单起见就直接声明了

intmain()
{
func();
}

func.c

#include<stdio.h>

voidfunc()
{
printf("helloworld ");
}

makefile

.PHONY:allmain.ofunc.o

all:main.ofunc.o
@gccmain.ofunc.o-oout
main.o:main.c
@gcc-cmain.c-omain.o
func.o:func.c
@gcc-cfunc.c-ofunc.o

所有的都是最简单的

‘拾’ cygwin 中如何安装arm-linux-gcc交叉编译器

交叉编译工具链作为嵌入式Linux开发的基础,直接影响到嵌入式开发的项目进度和完成质量。由于目前大多数开发人员使用Windows作为嵌入式开发的宿主机,在Windows中通过安装VMware等虚拟机软件来进行嵌入式Linux开发,这样对宿主机的性能要求极高。Cygwin直接作为Windows下的软件完全能满足嵌入式Linux的开发工作,对硬件的要求低及方便快捷的特点成为嵌入式开发的最佳选择。

目前网络上Cygwin下直接可用的交叉编译器寥寥无几且版本都比较低,不能满足开源软件对编译器版本依赖性的要求(如低版本工具链编译U-Boot出现软浮点问题等);Crosstool等交叉工具链制作工具也是更新跟不上自由软件版本的进度;同时系统介绍Cygwin下制作交叉编译器方面的资料很少。针对上述情况,基于最新版gcc等自由软件构建Cygwin下的交叉编译器显得尤为迫切和重要。
构建前准备工作
首先Cygwin下必须保证基本工具比如make}gcc等来构建bootstrap-gcc编译器,这可以在安装Cygwin时选择安装。参照gcc等安装说明文档来在Cygwin下查看是否已经安装,如输入gcc --v等。
源码下载
gcc-4.5.0的编译需mpc的支持,而mpc又依赖gmp和mpfr库。从各个项目官方网站上下载的最新的源码:
binutils-2.20. l .tar.bz2
gmp-S.O. l .tar.bz2
mpc-0.8.2.tar.gz
mpfr-3.O.O.tar.bz2
gcc-4.S.O.tar.bz2
linux-2.6.34.tar.bz2
glibc-2.11.2.tar.bz2
glibc-ports-2. l l .tar.bz2
gdb-7. l.tar.bz2

设置环境变量
HOST:工具链要运行的目标机器;BUILD:用来建立工具链的机器;TARGET工具链编译产生的二进制代码可以运行的机器。
BUILD=i686-pc-cygwin
HOST=i686-pc-cygwin TARGET=arm-linux
SYSROOT指定根目录,$PREFIX指定安装目录。目标系统的头文件、库文件、运行时对象都将被限定在其中,这在交叉编译中有时很重要,可以防止使用宿主机的头文件和库文件。本文首选$SYSROOT为安装目录,$PREFIX主要作为glibc库安装目录。
SYSROOT=/cross-root
PREFIX=/cross-root/arm-linux
由于GCC-4.5.0需要mpfr,gmp,mpc的支持,而这三个库又不需要交叉编译,仅仅是在编译交叉编译链时使用,所以放在一个临时的目录。
TEMP_PREFIX=/build-temp
控制某些程序的本地化的环境变量:
LC ALL=POSIX
设置环境变量:
PATH=$SYSROOT/bin:儿in:/usr/bin
设置编译时的线程数f31减少编译时间:
PROCS=2
定义各个软件版本:
BINUTILS V=2.20.1
GCC V=4.5.0
GMP V=5.0.1
MPFR V=3.0.0
MPC V二0.8.2
LINUX V二2.6.34
GLIBC V=2.11.2
GLIBC-PORTS V=2.11
GDB V=7.1
构建过程详解
鉴于手工编译费时费力,统一把构建过程写到Makefile脚本文件中,把其同源码包放在同一目录下,执行make或顺次执行每个命令即可进行无人值守的编译安装交叉工具
链。以下主要以Makefile执行过程为主线进行讲解。
执行“make”命令实现全速运行
可在Cygwin的Shell环境下执行“make>make.log 2>&1”命令把编译过程及出现的错误都输出到make.log中,便于查找:
all:prerequest install-deps install-cross-stage-one install-
cross-stage-two
预处理操作
"make prerequest',命令实现单步执行的第一步,实现输出变量、建立目录及解压源码包等操作。0'set十h”关闭bash的Hash功能,使要运行程序的时候,shell将总是搜索PATH里的目录[4]。这样新工具一旦编译好,shell就可以在$(SYSROOT)/bin目录里找到: prerequest:
set +h&&mkdir -p $(SYSROOT)/bin&&
mkdir -p $(PREFIX)/include&&
mkdir -p $(TEMP一REFIX)&&
export PATH LCes ALL&&
tar -xvf gmp-$(GMP_V).tar.bz2&&
tar -xvf mpfr-$(MPFR_V).tar.bz2&&
tar -xvf mpc-$(MPC_V).tar.gz&&
tar -xvf binutils-$(BINUTILS_V).tar.bz2&&
tar -xvf gcc-$(GCC_V).tar.bz2&&
tar -xvf linux-$(LINUX_V).tar.bz2&&
tar -xvf glibc-$(GLIBC_V).tar.bz2&&
tar -xvf glibc-ports-$(GLIBC-PORTS_V).tar.bz2&&
my glibc-ports-$(GLIBC-PORTS_V)
glibc-$(GLIBC_V)/ports&&
tar -xvf gdb-$(GDB V).tar.bz2
非交叉编译安装gcc支持包mpc
00make install-deps”命令实现单步执行的第二步,实现mpc本地编译,mpc依赖于gmp和mpfr
install-deps:gmp mpfr mpc
gmp:gmp-$(GMP_V)
mkdir -p build/gmp&&cd build/gmp&&
../../gmp-*/configure
--disable-shared --prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS)&&$(MAKE) install
mpfr:mpfr-$(MPFR_V)
mkdir -p b-uild/mpfr&&cd build/mpfr&&
../..//mpfr-*/configure
LDF'LAGS="-Wl,-search_paths_first”--disable-shared
--with-gmp=$(TEMP_PREFIX)
--prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS) all&&$(MAKE) install
mpc: mpc-$(MPC_V) gmp mpfr
mkdir -p build/mpc&&cd build/mpc&&
../../mpc-*/configure
--with-mpfr=$(TEMP PREFIX)
--with-gmp=$(TEMP_PREFIX)
--prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS)&&$(MAKE) install
交叉编译第一阶段
"make install-cross-stage-one',命令实现单步执行的第三步,编译安装binutils,bootstrap-gcc和获取Linux内核头文件:
install-cross-stage-one:cross-binutils cross-gcc get-kernel-headers
编译安装binutils
cross-binutils: binutils-$(BINUTILS_ V)
mkdir -p build/binutils&&cd build/binutils&&
../..//binutils-*/configure --prefix=$(SYSROOT)
--target=$(TARGET)--disable-nls&&
$(MAKE)j$(PROCS)&&$(MAKE) install
编译安装bootstrap-gcc。使用一disable-shared参数的意思是不编译和安装libgcc_ eh.a文件。glibc软件包依赖这个库,因为它使用其内部的一lgcc_eh来创建系统[6]。这种依赖
性,可通过建立一个指向libgcc.a符号链接得到满足,因为该文件最终将含有通常在libgcc- eh.a中的对象(也可通过补丁文件实现)。
cross-gcc:gcc-$(GCC_V)
mkdir -p build/gcc&&cd build/gcc&&
二//gcc-*/configure
--target=$(TARGET)--prefix=$(SYSROOT)
--disable-nls --disable-shared --disable-multilib
--disable-decimal-float--disable-threads
--disable-libmudflap --disable-libssp
--disable-libgomp --enable-languages=c
--with-gmp=$(TEMP_PREFIX)
--with-mpfr=$(TEMP_PREFIX)
--with-mpc=$(TEMP_PREFIX)&&
$(MAKE) -j$(PROCS)&&$(MAICE) install&&
In -vs libgcc.a'arm-linux-gcc -print-libgcc-file-name I
sed's/libgcc/& eh/'}
获取Linux内核头文件:
get-kernel-headersainux-$(LINUX_V)
cd linux-$(LINUX_V)&&
$(MAICE) mrproper&&$(MAKE) headers check&&
$(MAKE) ARCH=arm&&
INSTALLes HDR_ PATH=dest headers_ install&&
find dest/include
(-name .install一。-name ..installNaNd)-delete&&
cp -rv desdinclude/* $(PREFIX)/include
交叉编译第二阶段
编译安装glibc、重新编译安装binutils、完整编译安装gcc和编译安装gdb o "make install-cross-stage-two',命令实现单步执行的第四步: install-cross-stage-two:cross-glibc cross-rebinutils cross-g++ cross-gdb
编译安装glibca glib。的安装路径特意选为$(PREFIX),与gcc更好找到动态链接库也有关系,选在$(SYSROOT)提示找不到crti.o; glibc已经不再支持i386; glibc对ARM等的处理器的支持主要通过glibc-ports包来实现;正确认识大小写敏感(Case Sensitive)和大小写不敏感(CaseInsensitive)系统,大小写敏感问题主要影响到glibc,是交叉编译glibc成功的关键:Cygwin帮助手册中可知Cygwin是默认大小写不敏感的n},但是UNIX系统是大小写敏感的,这也是Cygwin和UNIX类系统的一个区别。通过作者自行参考制作的glibc-2.11.2-cygwin.patch补T使glibc变为Case-Insensitive,此补丁主要是对大小写敏感问题改名来实现。
交叉编译过程中安装的链接器,在安装完Glibc以前都无法使用。也就是说这个配置的forced unwind支持测试会失败,因为它依赖运行中的链接器。设置libc_ cvforced unwind=yes这个选项是为了通知configure支持force-unwind,而不需要进行测试。libc cv_c_cleanup=yes类似的,在configure脚本中使用libc_cv_c cleanup=yes,以便配置成跳过测试而支持C语言清理处理。
cross-glibc:glibc-$(GLIBC_V)
cd glibc-$(GLIBC_V)&&
patch -Np 1 –i...//glibc-2.11.2-cygwin.patch&&
cd..&&mkdir -p build/glibc&&
cd build/glibc&&
echo"libc cv_forcedes unwind=yes">config.cache&&
echo "libc cv_c_cleanup=yes">>config.cache&&
echo "libc cv_arm_tls=yes">>config.cache&&
../../glibc-*/configure --host=$(TARGET)
--build=$(../OneScheme/glibc-2.11.2/scripts/config.guess)
--prefix=$(PREFIX)--disable-profile
--enable-add-ons --enable-kernel=2.6.22.5
--with-headers=$(PREFIX)/include
--cache-file=config.cache&&
$(MAKE)&&$(MAKE) install
重新编译安装binutils。编译之前要调整工具链,使其
指向新生成的动态连接器。
调整工具链:
SPECS=
'dirname $(arm-linux-gcc -print-libgcc-file-name)'/specs
arm-linux-gcc -mpspecs
sed -e 's@/lib(64)\?/ld@$(PREFTX)&@g' -e ,}/}}*cPP}$/{n;s,$,-isystem $(PREFIX)/include,}"
>$SPECS
echo "New specs file is: $SPECS"
unset SPECS
测试调整后工具链:
echo 'main(川’>mmy.c
arm-linux-gcc
-B/cross-root/arm-linux/lib mmy.c
readelf -1 a.out I grep’:/cross-roobarm-linux'
调整正确的输出结果:
[Requesting program interpreter: /tools/lib/ld-linux.so.2j
一切正确后删除测试程序:
rm -v mmy.c a.out
重新编译binutils。指定--host,--build及--target,否则配置不成功,其config.guess识别能力不如gcc做的好。
cross-rebinutils: binutils-$(BINUTILS_V)
mkdir -p build/rebinutils&&
cd build/rebinutils&&CC="$(TARGET)-gcc
-B/cross-roodarm-linux/lib/"&&AR=$(TARGET)-ar&&
RANLIB=$(TARGET)-ranlib&&../..//binutils-*/configure
--host=$(HOST)--build=$(BUILD)--target=$(TARGET)
--prefix=$(SYSROOT)--disable-nls
--with-lib-path=$(PREFIX)/lib&&
$(MAKE)--$(PROCS)&&$(MAKE) install
高于4.3版的gcc把这个编译当作一个重置的编译器,并且禁止在被一prefix指定的位置搜索startfiles。因为这次不是重置的编译器,并且$(SYSROOT)目录中的startfiles对于创
建一个链接到$$(SYSROOT)目录库的工作编译器很重要,所以我们使用下面的补丁,它可以部分还原gcc的老功能tai . patch -Npl –i../gcc-4.5.0-startfiles_fix-l.patch
在正常条件下,运行gcc的fixincludes脚本,是为了修复可能损坏的头文件。它会把宿主系统中已修复的头文件安装到gcc专属头文件目录里,通过执行下面的命令,可以抑
制fixincludes脚本的运行[9](此时目录为/gcc-4.5.0)。
cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@'
gcc/Makefile.in.orig > gcc/Makefile.in
下面更改gcc的默认动态链接器的位置,使用已安装在/cross-root/ann-linux目录下的链接器,这样确保在gcc真实的编译过程中使用新的动态链接器。即在编译过程中创建的所有
二进制文件,都会链接到新的glibc文件
for file in
$(find gcc/config -name linux64.h-o -name linux.h –o -name sysv4.h)
do cp -uv $file{,.orig}
sed -a 's@/lib(64)?(32)?/Id@/cross-root/arm-linux&@g’-e's@/usr@/cross-rootlarm-linux@g' $file.orig>$file echo‘
#undef STANDARD INCLUDE DIR
#define STANDARD_ INCLUDE DIR "/cross-root/arm-linux/include"
#define STANDARD STARTFILE PREFIX 1 "/cross-root/arm-linux/lib"
#define STANDARD_ STARTFILE_ PREFIX_ 2””’>>$file
touch $file.orig done
完整编译安装gcc。最好通过指定--libexecdir更改libexecdir到atm-linux目录下。--with-local-prefix选项指定gcc本地包含文件的安装路径此处设为$$(PREFIX),安装后就会在内核头文件的路径下。路径前指定$(Pwd)则以当前路径为基点,不指定则默认以/home路径为基点,这点要注意。
cross-g++:gcc-$(GCC-)
mkdir -p build/g十+&&cd build/g++&&
CC="$(TARGET)-gcc AR=$(TARGET)-ar&&
-B/cross-roodarm-linux/lib/"&&
RANLIB=$(TARGET)-ranlib&&
..//gcc-*/configure
--host=$(HOST)--build=$(BUILD)--target=$(TARGET)
--prefix=$(SYSROOT)--with-local-prefix=$(PREFIX)
--enable-clocale=gnu --enable-shared
--enable-threads=posix --enable -cxa_atexit
--enable-languages=c,c++--enable-c99
--enable-long-long --disable-libstdcxx-pch
--disable-libunwind-exceptions
--with-gmp=$(TEMP_PREFIX)
--with-mpfr=$(TEMP_PREFIX)
--with-mpc=$(TEMP_PREFIX)&&
$(MAKE) LD_IBRARY_ATH=
$(pwd)/$(../../gcc-4.5.0/config.guess)/libgcc&&
$(MAKE) install
编译安装gdb,至此完成整个工具链的制作。
cross-gdb: gdb-$(GDB V)
mkdir -p build/gdb&&cd build/gdb&&
../../gdb-*/configure --prefix=$(SYSROOT)
--target=$(TARGET)--disable-werror&&
$(MAKE)-j$(PROCS)&&$(MAKE) install
“make clean”命令清除编译生成的文件和创建解压的文件夹
.PHONY:clean
dean:
rm -fr $(TEMP_PREFIX) build
binutils-$(BINUTIL,S_V) gcc-$(GCC_V)
glibc-$(NEWL.IB_V) gdb-$(GDB_V)
gmp-$(GMP_V) mpc-$(MPC_V) mpfr-$(MPFR_V)
工具链测试
命令行中输入以下内容:
echo 'main(){}’>mmy.c
arm-linux-gcc -o mmy.exe mmy.c
file mmy.exe
运行正常的结果:
mmy.exe: ELF 32-bit LSB executable, ARM, version 1,for GNU/Linux 2.6.22, dynamically linked (uses shared libs),not stripped.

阅读全文

与phony编译器相关的资料

热点内容
单片机每个程序的含义 浏览:748
学好玩命令方块 浏览:953
手机解压两个分开的压缩包 浏览:963
程序员想调薪怎么和领导说 浏览:856
编译的底层实现 浏览:550
32位机器上编译出64的动态库 浏览:924
python办公数据类型 浏览:913
传统8051单片机介绍 浏览:628
app拉新公司如何运营 浏览:618
枪法pdf 浏览:62
ios如何设置安卓虚拟返回键 浏览:697
mysql命令执行sql 浏览:97
惠普内嵌服务器怎么打开 浏览:413
cmd命令查看网络 浏览:819
程序员秘密 浏览:932
如何宣传app引流 浏览:73
图说红楼梦中央编译 浏览:173
php查询赋值 浏览:271
java程序员面试宝典第四版pdf 浏览:931
2021流行加密加长睫毛膏 浏览:644