今天就实践一下目标文件依赖在不同文件夹中的文件:
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是Unix环境下用于自动化编译和链接的脚本文件,它可以帮助开发者管理和构建复杂的C/C++项目。本篇笔记主要探讨Makefile在满足可重用性、易用性和全面覆盖性等需求时的实现方法。 ##...
第2章到第13章深入介绍了Makefile的各个细节。在第2章程序的编译和链接部分,讲解了程序从源代码到可执行文件的编译过程,包括预处理、编译、汇编和链接等步骤。这一章为学习Makefile中的规则奠定了基础。 第3章...
13. 嵌套执行make:在Makefile中可以嵌套调用make命令,这在大型项目中尤其有用。 14. Make的工作方式:Make通过比较时间戳来判断目标文件是否需要更新,以此决定是否执行相关的构建命令。 15. 条件判断:Makefile...
13. 书写规则 规则的语法是关键,包括目标、依赖和命令三部分。通配符(如`*`)可以匹配多个文件名,文件搜寻功能允许查找目录下的特定文件。伪目标(如`.PHONY`)用于标记那些实际不存在但需要执行的命令。多目标...
13. **递归`make`(Recursive Make)**:在一个`Makefile`中调用`make`来处理子目录的`Makefile`,便于多级目录项目管理。 14. **编译过程**:`Makefile`常用于编译C/C++程序,包括预处理、编译、汇编和链接步骤,...
《GNU Makefile中文手册》是针对GNU make工具的详尽指南,主要涵盖了Makefile的编写、规则、变量、条件执行、内嵌函数...在阅读本书时,根据自己的知识背景选择合适的章节,逐步深入学习,将有助于成为更专业的程序员。
【Makefile简介】新手应该从基本概念开始学习,如变量、规则、目标和依赖等。每一章的前几节通常包含概述和基础信息,后面的节则涉及更具体的细节。第2章全都是关于Makefile的基本结构和语法的介绍。 【GNU make...
13. Makefile的模式规则 模式规则允许使用模式来匹配多个目标,简化了Makefile的编写。 14. Makefile的高级特性 包括变量的高级用法、函数的使用、模式规则和模式函数,以及Makefile的重构等。 15. Makefile的实践...
《跟我一起写Makefile》这篇文章是一篇非常实用的...通过学习和实践《跟我一起写Makefile》这篇文章,你将能够熟练掌握Makefile的编写技巧,提升项目构建的效率,降低出错的可能性,使你的软件开发工作更加高效和有序。
【描述】中提到的“狄泰软件学院的门徒计划的make专题”表明这是一个系统性的学习课程,旨在帮助学员掌握makefile的所有核心概念和实用技巧。"全部makefile知识点"涵盖的内容广泛,包括基本语法、变量使用、条件判断...
学习 GNU Make 前,需要掌握基本的 shell 脚本语法、命令行基础知识以及一定的编程经验。 #### 二、GNU Make 介绍 **2.1 Makefile 简介** Makefile 是一个包含一系列规则的文件,用于指导 GNU Make 如何构建目标...
### Makefile基础与实战编译大型C/C++项目...通过以上内容的学习和实践,开发者可以全面掌握Makefile在C/C++项目中的应用,并能够灵活运用到实际工作中。这不仅有助于提高编译效率,还能确保项目的可维护性和可扩展性。
13. **GLog:** - `-DGLOG_INCLUDE_DIR`:指定GLog头文件的路径。 - `-DGLOG_LIBRARY`:指定GLog库文件的路径。 14. **LMDB:** - `-DLMDB_INCLUDE_DIR`:指定LMDB头文件的路径。 - `-DLMDB_LIBRARIES`:指定...
13. **第 13 章:不兼容性和缺失特性** —— 列举了与其它 make 实现之间的差异以及 GNU Make 当前版本中缺少的功能。 14. **第 14 章:makefile 编写约定** —— 给出了一些编写 makefile 的最佳实践建议。 15. **...
标题中的“一套IM完整的UI实现方案”指的是一个即时通讯...ChatKit-master作为一个完整的UI实现方案,很可能包含了上述所有或部分功能的实现代码,开发者可以通过研究这个项目,学习如何构建一个功能完善的IM应用。
GNU Make是一个广泛使用的构建工具,它通过读取Makefile文件,决定如何编译和链接程序。Makefile文件包含了文件之间的依赖关系,并指定...对于熟悉和掌握Linux编程及GCC编程的开发者来说,该手册是不可或缺的学习资源。
3. 编译脚本:可能是makefile或者IAR编译器的项目配置文件,用于构建和编译代码。 4. 说明文档:可能有开发者编写的README文件,介绍了如何编译、烧录和测试该项目。 为了实现这个项目,开发者需要了解以下几个关键...
13. **Makefile**:理解Makefile的编写,学会自动化编译和链接多个源文件,以及管理依赖关系。 以上知识点构成了Linux环境下C语言编程的基础,通过深入学习和实践,你可以熟练地开发和调试Linux系统上的C程序。...