请教一个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) -cfac.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: *** Error 1
搞了一上午想不明白。 头文件是找到了,可是链接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 -cfac.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. 我那样用头文件肯定没问题,最简单的了,但是那样编译为什么不对,我上面的想法哪个地方错了? 原帖由 术士 于 2008-3-11 14:14 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
我想:已经在main函数里面包含了头文件,当编译器进行编译main的时候会把子函数的实现扩展到man函数实现里面,然后生成.o文件,就不需要factorial.o了吧。反之,我如果makefile写成这样:
fac:fac.o factorial ...
“当编译器进行编译main的时候会把子函数的实现扩展到man函数实现里面”
那么,还要链接干什么? 哦,明白了,那是链接做的事情,那么我使用系统的头文件,可以直接使用所包含的一些函数,我也想模拟这样的用法,于是采用了上面的方法,一直实现不了,能不能指点一下思路? 关键你干嘛觉得这样很爽?
虽然有个办法可以做到,但是鄙人实在不希望有人采用。
[ 本帖最后由 cjaizss 于 2008-3-11 23:05 编辑 ] 我觉得这样做的话,我自己可以定义一个函数库,以后使用通用函数的时候只需要使用头文件即可,不必去理会子函数的代码在哪里,怎么实现的,C语言的库不也是这样的吗,这样模拟出来,我觉得很爽阿。
快给指点什么办法,谢过了。 请习惯-L和-l
页:
[1]
2