`
test_angel
  • 浏览: 51674 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

Makefile学习(13)

 
阅读更多

今天就实践一下目标文件依赖在不同文件夹中的文件:

 

 

VPATH的作用:是指定我们在当前目录中如果找不到依赖文件,则在VPATH所指定的文件中找。比如:

我们我们的文件目录结构如下:

make(文件夹)

|——makefile(里面的文件依赖于submake1  submake2文件夹中的文件)

|——submake1(文件夹)

|——submake2(文件夹)

 

则我们只需要在makefile文件开头指定:

VPATH=./submake1 ./submake2

 

例如:

#my first makefile
VPATH= ./submake1 ./submake2
$(warning finish include)
jar:= f10.o  f11.o
$(warning start gcc)
f:f10.o f11.o
	gcc -c $(jar) -o f
f10.o: f.o f1.o f2.o f3.o
	@echo "gcc"
	gcc -o f10.o  f.o f1.o f2.o f3.o
f11.o:f7.o f5.o f6.o f4.o
	@echo "gcc"
	gcc -o f11.o f7.o f5.o f6.o f4.o
$(warning finish gcc)
.PHONY:clean
clean:
	rm f  *.o

 

通过以上代码我们执行的结果如下:

写道
makefile:3: finish include
makefile:5: start gcc
makefile:14: finish gcc
cc -c -o f7.o ./submake2/f7.c
cc -c -o f5.o ./submake2/f5.c
cc -c -o f6.o ./submake2/f6.c
cc -c -o f4.o ./submake2/f4.c
gcc
gcc -o f11.o f7.o f5.o f6.o f4.o
gcc -c f10.o f11.o -o f
gcc: f10.o: linker input file unused because linking not done
gcc: f11.o: linker input file unused because linking not done

 

 

对于其中的" linker input file unused because linking not done"这个问题,造成的原因是因为发f10.o f11.o也是目标文件,所以gcc -c  $(jar) -o f应改为  gcc -o f $(jar)。

 

 

修改后执行上一段代码:

执行make,生成了相应的f10.o  f11.o ,但是还报以下错误:

写道
makefile:3: finish include
makefile:5: start gcc
makefile:14: finish gcc
cc -c -o f.o ./submake1/f.c
cc -c -o f1.o ./submake1/f1.c
cc -c -o f2.o ./submake1/f2.c
cc -c -o f3.o ./submake1/f3.c
gcc
gcc -o f10.o f.o f1.o f2.o f3.o
cc -c -o f7.o ./submake2/f7.c
cc -c -o f5.o ./submake2/f5.c
cc -c -o f6.o ./submake2/f6.c
cc -c -o f4.o ./submake2/f4.c
gcc
gcc -o f11.o f7.o f5.o f6.o f4.o
gcc -o f f10.o f11.o
f10.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.text+0x0): first defined here
f10.o:(.rodata+0x0): multiple definition of `_fp_hw'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.rodata+0x0): first defined here
f10.o: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crti.o:(.fini+0x0): first defined here
f10.o:(.rodata+0x4): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.rodata.cst4+0x0): first defined here
f10.o: In function `__data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.data+0x0): first defined here
f10.o: In function `__data_start':
(.data+0x4): multiple definition of `__dso_handle'
/usr/lib/gcc/i486-linux-gnu/4.4.3/crtbegin.o:(.data+0x0): first defined here
f10.o: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crti.o:(.init+0x0): first defined here
f11.o: In function `__libc_csu_fini':
(.text+0x130): multiple definition of `__libc_csu_fini'
f10.o:(.text+0x130): first defined here
f11.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.text+0x0): first defined here
f11.o:(.rodata+0x0): multiple definition of `_fp_hw'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.rodata+0x0): first defined here
f11.o: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crti.o:(.fini+0x0): first defined here
f11.o:(.rodata+0x4): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.rodata.cst4+0x0): first defined here
f11.o: In function `__data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.data+0x0): first defined here
f11.o: In function `__data_start':
(.data+0x4): multiple definition of `__dso_handle'
/usr/lib/gcc/i486-linux-gnu/4.4.3/crtbegin.o:(.data+0x0): first defined here
f11.o:(.dtors+0x4): multiple definition of `__DTOR_END__'
f10.o:(.dtors+0x4): first defined here
f11.o: In function `__libc_csu_init':
(.text+0x140): multiple definition of `__libc_csu_init'
f10.o:(.text+0x140): first defined here
f11.o: In function `__i686.get_pc_thunk.bx':
(.text+0x19a): multiple definition of `__i686.get_pc_thunk.bx'
f10.o:(.text+0x19a): first defined here
f11.o: In function `main':
(.text+0xb4): multiple definition of `main'
f10.o:(.text+0xb4): first defined here
f11.o: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crti.o:(.init+0x0): first defined here
/usr/lib/gcc/i486-linux-gnu/4.4.3/crtend.o:(.dtors+0x0): multiple definition of `__DTOR_END__'
f10.o:(.dtors+0x4): first defined here
collect2: ld returned 1 exit status
make: *** [f] 错误 1

重复定义,可是目前还是不知道怎么改!!!!


对几个依赖文件的说明:

f10.o依赖的文件中f.c包含main方法

f11.o依赖的文件中f7.c包含main方法

其他的文件中都是各自的方法

 

最终目标f依赖于f10.o  f11.0

 

 

 

网上找了找,说可能是我的c文件有问题,可是我不知道怎么改???

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Makefile学习笔记1

    【Makefile学习笔记1】 Makefile是Unix环境下用于自动化编译和链接的脚本文件,它可以帮助开发者管理和构建复杂的C/C++项目。本篇笔记主要探讨Makefile在满足可重用性、易用性和全面覆盖性等需求时的实现方法。 ##...

    makefile基础教程

    第2章到第13章深入介绍了Makefile的各个细节。在第2章程序的编译和链接部分,讲解了程序从源代码到可执行文件的编译过程,包括预处理、编译、汇编和链接等步骤。这一章为学习Makefile中的规则奠定了基础。 第3章...

    让你快速学习如何写makefile,《跟我一起学习写makefile》

    13. 嵌套执行make:在Makefile中可以嵌套调用make命令,这在大型项目中尤其有用。 14. Make的工作方式:Make通过比较时间戳来判断目标文件是否需要更新,以此决定是否执行相关的构建命令。 15. 条件判断:Makefile...

    make file 学习资料

    13. 书写规则 规则的语法是关键,包括目标、依赖和命令三部分。通配符(如`*`)可以匹配多个文件名,文件搜寻功能允许查找目录下的特定文件。伪目标(如`.PHONY`)用于标记那些实际不存在但需要执行的命令。多目标...

    red hat linux 的makefile资料

    13. **递归`make`(Recursive Make)**:在一个`Makefile`中调用`make`来处理子目录的`Makefile`,便于多级目录项目管理。 14. **编译过程**:`Makefile`常用于编译C/C++程序,包括预处理、编译、汇编和链接步骤,...

    GNU-Makefile中文手册-Ver3.8.pdf

    《GNU Makefile中文手册》是针对GNU make工具的详尽指南,主要涵盖了Makefile的编写、规则、变量、条件执行、内嵌函数...在阅读本书时,根据自己的知识背景选择合适的章节,逐步深入学习,将有助于成为更专业的程序员。

    makefile速成手册

    【Makefile简介】新手应该从基本概念开始学习,如变量、规则、目标和依赖等。每一章的前几节通常包含概述和基础信息,后面的节则涉及更具体的细节。第2章全都是关于Makefile的基本结构和语法的介绍。 【GNU make...

    跟我一起写Makefile(整理版.pdf

    13. Makefile的模式规则 模式规则允许使用模式来匹配多个目标,简化了Makefile的编写。 14. Makefile的高级特性 包括变量的高级用法、函数的使用、模式规则和模式函数,以及Makefile的重构等。 15. Makefile的实践...

    跟我一起写Makefile

    《跟我一起写Makefile》这篇文章是一篇非常实用的...通过学习和实践《跟我一起写Makefile》这篇文章,你将能够熟练掌握Makefile的编写技巧,提升项目构建的效率,降低出错的可能性,使你的软件开发工作更加高效和有序。

    狄泰软件学院makefile专题全部课件和代码

    【描述】中提到的“狄泰软件学院的门徒计划的make专题”表明这是一个系统性的学习课程,旨在帮助学员掌握makefile的所有核心概念和实用技巧。"全部makefile知识点"涵盖的内容广泛,包括基本语法、变量使用、条件判断...

    Makefile V3.8手册

    学习 GNU Make 前,需要掌握基本的 shell 脚本语法、命令行基础知识以及一定的编程经验。 #### 二、GNU Make 介绍 **2.1 Makefile 简介** Makefile 是一个包含一系列规则的文件,用于指导 GNU Make 如何构建目标...

    Makefile基础与实战编译大型C-C++项目

    ### Makefile基础与实战编译大型C/C++项目...通过以上内容的学习和实践,开发者可以全面掌握Makefile在C/C++项目中的应用,并能够灵活运用到实际工作中。这不仅有助于提高编译效率,还能确保项目的可维护性和可扩展性。

    caffe2编译-cmake指令及之后生成makefile文件中需添加的变量

    13. **GLog:** - `-DGLOG_INCLUDE_DIR`:指定GLog头文件的路径。 - `-DGLOG_LIBRARY`:指定GLog库文件的路径。 14. **LMDB:** - `-DLMDB_INCLUDE_DIR`:指定LMDB头文件的路径。 - `-DLMDB_LIBRARIES`:指定...

    GNU make 官方学习文档

    13. **第 13 章:不兼容性和缺失特性** —— 列举了与其它 make 实现之间的差异以及 GNU Make 当前版本中缺少的功能。 14. **第 14 章:makefile 编写约定** —— 给出了一些编写 makefile 的最佳实践建议。 15. **...

    一套IM完整的UI实现方案_Objective-C_Makefile_下载.zip

    标题中的“一套IM完整的UI实现方案”指的是一个即时通讯...ChatKit-master作为一个完整的UI实现方案,很可能包含了上述所有或部分功能的实现代码,开发者可以通过研究这个项目,学习如何构建一个功能完善的IM应用。

    GNU Make 使用手册(中译版).pdf

    GNU Make是一个广泛使用的构建工具,它通过读取Makefile文件,决定如何编译和链接程序。Makefile文件包含了文件之间的依赖关系,并指定...对于熟悉和掌握Linux编程及GCC编程的开发者来说,该手册是不可或缺的学习资源。

    tiny13虚拟串口与adc

    3. 编译脚本:可能是makefile或者IAR编译器的项目配置文件,用于构建和编译代码。 4. 说明文档:可能有开发者编写的README文件,介绍了如何编译、烧录和测试该项目。 为了实现这个项目,开发者需要了解以下几个关键...

    linuxC编程一站式学习_部分4_linux_

    13. **Makefile**:理解Makefile的编写,学会自动化编译和链接多个源文件,以及管理依赖关系。 以上知识点构成了Linux环境下C语言编程的基础,通过深入学习和实践,你可以熟练地开发和调试Linux系统上的C程序。...

Global site tag (gtag.js) - Google Analytics