日期:2014-05-16  浏览次数:21037 次

gcc编译链接时无法找到自己的头文件?
一共有3个文件
main.c message.c message.h

其中message.c的内容
C/C++ code

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




message.h的内容
C/C++ code

extern void goodbye();



main.c的内容
C/C++ code

#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!!!谢谢


------解决方案--------------------
gcc -o goodbye main.c用法本来就有问题啊

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

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

gcc -o goodbye main.c message.c是正确的,而且不需要单独运行前两步
------解决方案--------------------
头文件只是只起到检查的作用,真正到链接时必须要有相应符号的声明或者实现
------解决方案--------------------
这明显是链接错误

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

缺少的符号要linker进行查询,如果用户没有指明,则会在系统既定搜索库(和编译gcc的target有关)中搜索,找不到就提示undefined reference错误