原始的2文件的makefile错误

  从来没系统的看过makefile文档,平时属于复制模板,用完即忘,下午尝试按自己的理解写一个最简单的makefile,含2个.c文件,1个.h文件,费了个把小时,参考别人的文章才弄出来,特记录。

main.c:

1 #include <stdio.h>
2 #include "command.h"
3
4 int main(int argc, const char *argv[])
5 {
6         printf("run in main\n");
7         command();
8         return 0;
9 }

commad.c:

1 #include <stdio.h>
2 #include "command.h"
3
4 void command(void)
5 {
6         printf("run in command\n");
7 }

commad.h:

1 #ifndef __COMMAND_H__
2 #define __COMMAND_H__
3
4 void command(void);
5
6 #endif

makefile:

 1 objects = main.o command.o
 2
 3 main:$(objects)
 4     gcc  $(objects) -o main
 5
 6 main.o:main.c command.h
 7     gcc  main.c -o main.o
 8
 9 command.o:command.c command.h
10     gcc command.c -o command.o
11
12
13 .PHONY:clean
14 clean:
15     rm main $(objects)

make之后,报错:

  gcc main.c -o main.o
  /tmp/ccTBTS4t.o:在函数‘main’中:
  main.c:(.text+0x16):对‘command’未定义的引用
  collect2: error: ld returned 1 exit status
  make: *** [main.o] 错误 1
于是开始了我的第一个错误理解,我的makefile出错在6-7行,执行生成目标main.o时,我看到错误,认为是我的目标依赖应该要包含commad.o,因为我的main.c调用了command.c里面的函数。于是我为main.o添加依赖commad.o,

 1 objects = main.o command.o
 2
 3 main:$(objects)
 4     cc $(objects) -o main
 5
 6 main.o:main.c command.o command.h
 7         gcc main.c  command.o -o main.o
 8
 9 command.o:command.c command.h
10         gcc command.c -o command.o
11
12
13 .PHONY:clean
14 clean:
15     rm main $(objects)

看到6-7行,觉得超不对劲,姑且不管,再次make,由于依赖关系,推导执行到command.o:

  gcc command.c -o command.o
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 12
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 20 has invalid symbol index 13
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 21 has invalid symbol index 22
  /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
  /usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o:在函数‘_start’中:
  (.text+0x18):对‘main’未定义的引用
  collect2: error: ld returned 1 exit status
  make: *** [command.o] 错误 1

看到了/usr/bin/ld,没错,就是进行了链接操作,也就是生成可执行文件的最后一步,问题是我这里只不过是想把command.c生成目标文件command.o。于是怀疑gcc  command.c -o command.o这个格式不正确。回忆下一个可执行文件的生成过程:预编译,汇编(对高级于汇编语言的才有),编译,链接。而我只想它停在编译后。将这几个步骤拆分:

预编译:

  gcc -E a.c -o a.i

汇编:

  gcc -S a.i -o a.s

编译:

  gcc -c a.s -o a.o

链接:

  gcc a.o -o a

  其实最后这个链接还可以细分,比如这里会将command.o main.o ,libc库(我用了printf),还有就是链接加载库,一起链接成可执行文件。

于是我的错误就漏了 “-c” ,补上:

 1 objects = main.o command.o
 2
 3 main:$(objects)
 4     cc $(objects) -o main
 5
 6 main.o:main.c command.h
 7         gcc -c main.c -o main.o
 8
 9 command.o:command.c command.h
10         gcc -c command.c -o command.o
11
12
13 .PHONY:clean
14 clean:
15     rm main $(objects)

main.c中调用了command.c里面的函数也并不需要将其作为main.o的依赖,因为main.o中调用command()函数会留一个符号表在main.o文件中,直到最后进行链接的时候才确定其具体值。

时间: 2024-10-19 19:47:06

原始的2文件的makefile错误的相关文章

.m文件导入C++头文件带来的错误

这几天的工作挖了不少的坑,遇到了各种千奇百怪的错误,现在好好总结一下. 新建一个工程,然后新建HelloCPP.h,HelloCPP.cpp文件,HelloCPP.h文件内容如下: #ifndef __CPPWrong__HelloCPP__ #define __CPPWrong__HelloCPP__ //#include <stdio.h> namespace hello { }; #endif /* defined(__CPPWrong__HelloCPP__) 就一个空的namespa

Linux下使用vi新建文件保存文件时遇到错误:E212: Can&#39;t open file for writing

出现E212: Can't open file for writing的问题是由于权限问题导致的,解决方法有以下思路: 1.使用root进行登录,然后再操作. 2.在使用命令时,前面加sudo. 3.如果是多级文件夹的文件时,由于这个文件夹没有创建,所以要先创建这个文件夹,再来操作这个文件. Linux下使用vi新建文件保存文件时遇到错误:E212: Can't open file for writing

关于SQL Server 安装程序在运行 Windows Installer 文件时遇到错误

前几日安装sql server2008r2 的时候碰到这个问题: 出现以下错误: SQL Server 安装程序在运行 Windows Installer 文件时遇到错误. Windows Installer 错误消息: 打开安装日志文件的错误.请验证指定的日志文件位置是否存在,是否可以写入. Windows Installer 文件: D:\qqdownload\cn_sql_server_2014_express_with_advanced_services_x64_exe_3949524\

VS2010中&lt;无法打开包括文件:“iostream.h”:&gt;错误解决方法

C/C++ code? 1 2 #include <iostream.h> 改为: C/C++ code? 1 2 #include <iostream> using namespace std; VS2010中<无法打开包括文件:"iostream.h":>错误解决方法

Android开发进阶(五)--使用原始的XML文件

应用场景 在Android应用开发过程中,有时候我们自己有一些XML文件是我们自己手动创建的,而在项目开发过程中可能会用到,也就是说这用到了原始的XML资源文件.这个XML原始资源文件我们可以通过Resouce类的以下两个方法来获得: getResouce.getXml(int id); getRawResouce(int id) 这两个方法返回的对象是一个XmlResouceParser类的对象.而XmlResouceParser类是XmlPullParser类的子类,所以我们可以Androi

文件上传错误:Error setting expression &#39;uploadImage&#39; with value &#39;[Ljava.lang.String;@5ff8a691&#39;

警告: Error setting expression 'uploadImage' with value '[Ljava.lang.String;@5ff8a691' ognl.MethodFailedException: Method "setUploadImage" failed for object [email protected] [java.lang.NoSuchMethodException: cn.itcast.upload.UploadAction.setUploa

word2007在试图打开文件时遇到错误解决方法

当您尝试在 Microsoft Office Word 2007 中打开 .docx 文件时,该文件打不开.此外,您还会收到以下错误消息: Word 在试图打开文件时遇到错误.请尝试下列方法:* 检查文档或驱动器的文件权限.* 确保有足够的内存和磁盘空间.* 用文本恢复转换器打开文件. 原因 发生此问题的原因是由于恢复文档被保存为扩展名为 .docx 的自动保存文档 (*.asd) 文件. 要解决此问题,请按照下列步骤操作: 确认 .asd 文件的默认位置.为此,请按照下列步骤操作: 启动 Wo

服务器上传文件出现500错误,但是其他不涉及文件的接口均正常

出现的情景描述: 1.有用户报告说注册无法成功,经过前端的盘查发现实在注册的时候必须调用的上传文件的接口A抛出500错误,但不是每次都抛出不过有很大几率抛出500. 2.A接口接受5个参数和一个文件multi类型,至传递前5个参数能够请求到代码,但是传入文件之后不是500错误就是很长时间超时. 3.重启nginx无效,问题依旧.重启fpm无效,问题依旧. 4.机器很久没有启动过了top显示内存占用较高于是重启机器.重启机器问题消失,A接口正常工作,15分钟后再次出现问题且症状依旧. 5.ngin

strut2 自己定义文件上传错误信息

在文件上传过程中我们能够指定拦截器对文件类型.后缀名.大小进行设定,action中的配置: <interceptor-ref name="fileUpload"> <param name="maximumSize">500000</param> <param name="allowedTypes">application/vnd.ms-excel</param> <param na