当前位置: 技术问答>linux和unix
gcc编译链接时无法找到自己的头文件?
来源: 互联网 发布时间:2017-01-24
本文导语: 一共有3个文件 main.c message.c message.h 其中message.c的内容 #include void goodbye(void) { printf("hello worldn"); } message.h的内容 extern void goodbye(); main.c的内容 #include #include "message.h" int main(int argc,char **argv) { ...
一共有3个文件
main.c message.c message.h
其中message.c的内容
message.h的内容
main.c的内容
直接编译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!!!谢谢
main.c message.c message.h
其中message.c的内容
#include
void goodbye(void)
{
printf("hello worldn");
}
message.h的内容
extern void goodbye();
main.c的内容
#include
#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是正确的,而且不需要单独运行前两步
这不是没找到头文件的问题,这是没找到实现,因为你第一种用法,根本没把goodbye的实现体message.c编译
并不是说找到了头文件,相应的源文件就自动编译了
gcc -o goodbye main.c message.c是正确的,而且不需要单独运行前两步
|
头文件只是只起到检查的作用,真正到链接时必须要有相应符号的声明或者实现
|
这明显是链接错误
头文件和实现本来就是分离的,你编译完了后得转交给ld进行链接时的工作
缺少的符号要linker进行查询,如果用户没有指明,则会在系统既定搜索库(和编译gcc的target有关)中搜索,找不到就提示undefined reference错误
头文件和实现本来就是分离的,你编译完了后得转交给ld进行链接时的工作
缺少的符号要linker进行查询,如果用户没有指明,则会在系统既定搜索库(和编译gcc的target有关)中搜索,找不到就提示undefined reference错误