gcc编译链接时无法找到自己的头文件?

freetstar 2011-12-11 01:33:29
一共有3个文件
main.c message.c message.h

其中message.c的内容

#include <stdio.h>
void goodbye(void)
{
printf("hello world\n");
}



message.h的内容

extern void goodbye();


main.c的内容

#include <stdio.h>
#include "message.h"
int
main(int argc,char **argv)
{
goodbye();
return 0;
}


直接编译gcc -o goodbye main.c,提示main.c:(.text+0x15): undefined reference to `goodbye'

分别编译,即gcc -c message.c 然后gcc -c main.c ,最后链接gcc -o goodbye main.c message.c 则ok,可产生运行goodbye可执行文件

为什么直接编译不ok呢?gcc默认应该在当前文件夹下寻找自己定义的头文件的啊...然后在连接的时候搞定啊,奇怪.试过了iquote和-L选项都不ok,

os:archlinux
gcc version:4.6.2
HELP!!!谢谢
...全文
1761 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyh12345 2011-12-12
  • 打赏
  • 举报
回复
同意一楼
makefile时,必须指定参与的源文件
蛮牛儿 2011-12-12
  • 打赏
  • 举报
回复
不晓得是什么错误,但是linux下多文件时,用makefile来操作管理十分方便
xunxun 2011-12-11
  • 打赏
  • 举报
回复
这明显是链接错误

头文件和实现本来就是分离的,你编译完了后得转交给ld进行链接时的工作

缺少的符号要linker进行查询,如果用户没有指明,则会在系统既定搜索库(和编译gcc的target有关)中搜索,找不到就提示undefined reference错误
念茜 2011-12-11
  • 打赏
  • 举报
回复
头文件只是只起到检查的作用,真正到链接时必须要有相应符号的声明或者实现
念茜 2011-12-11
  • 打赏
  • 举报
回复
头文件只是只起到检查的作用,真正到链接时必须要有相应符号的声明或者实现
jackyjkchen 2011-12-11
  • 打赏
  • 举报
回复
如果是没找到头文件,应该报类似于

#include "message.h" No Such File之类的错误
jackyjkchen 2011-12-11
  • 打赏
  • 举报
回复
gcc -o goodbye main.c用法本来就有问题啊

这不是没找到头文件的问题,这是没找到实现,因为你第一种用法,根本没把goodbye的实现体message.c编译

并不是说找到了头文件,相应的源文件就自动编译了

gcc -o goodbye main.c message.c是正确的,而且不需要单独运行前两步

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧