请教一个GCC编译的问题
有三个文件夹include,main,src 其中src下面放了函数,在include下面定义了个头文件,我在main下面建立了一个主函数,需要引用src下面的一个函数文件,于是我在main下面的文件里面include了头文件。然后Makefile这样写:
INC=-Iinclude
fac:fac.o
gcc $(INC) -o fac fac.o
fac.o:../../include/mylib.h fac.c
gcc $(INC) -c fac.c
.PHONY:clean
clean:
rm -f *.o main
为什么用gcc编译后,gcc一直报错:
-Iinclude -o fac fac.o
fac.o(.text+0x54): In function `main':
: undefined reference to `factorial'
collect2: ld returned 1 exit status
make: *** [fac] Error 1
搞了一上午想不明白。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
头文件是找到了,可是链接fac.o的时候怎么找到函数的实现呢?比如你的factorial函数所在的.o文件是怎么找到的呢?
我想:已经在main函数里面包含了头文件,当编译器进行编译main的时候会把子函数的实现扩展到man函数实现里面,然后生成.o文件,就不需要factorial.o了吧。反之,我如果makefile写成这样:
fac:fac.o factorial.o
gcc -o fac fac.o factorial.o
fac.o:fac.c
gcc -c fac.c
factorial.o:../../src/factorial.c
gcc -c ../../src/factorial.c
.PHONY:clean
clean:
rm -f *.o main
把所有的函数都编译成.o然后进行链接,这样可以成功,但是我在main函数里面包含的头文件也就没必要了。
我的想法是把一些常用的子函数都写成.c文件,然后包含到头文件里面。我以后再写程序的时候在main函数里面只需要包含头文件,就可以使用原来的子函数,而makefile文件里面也不去编译子函数的.c文件,如果很多.c文件,这样岂不是很麻烦。我觉得主要问题在于我写的makefile文件,初学makefile,help me.
我那样用头文件肯定没问题,最简单的了,但是那样编译为什么不对,我上面的想法哪个地方错了?
“当编译器进行编译main的时候会把子函数的实现扩展到man函数实现里面”
那么,还要链接干什么?
哦,明白了,那是链接做的事情,那么我使用系统的头文件,可以直接使用所包含的一些函数,我也想模拟这样的用法,于是采用了上面的方法,一直实现不了,能不能指点一下思路?
关键你干嘛觉得这样很爽?
虽然有个办法可以做到,但是鄙人实在不希望有人采用。
[ 本帖最后由 cjaizss 于 2008-3-11 23:05 编辑 ]
我觉得这样做的话,我自己可以定义一个函数库,以后使用通用函数的时候只需要使用头文件即可,不必去理会子函数的代码在哪里,怎么实现的,C语言的库不也是这样的吗,这样模拟出来,我觉得很爽阿。
快给指点什么办法,谢过了。
请习惯-L和-l