我有以下makefile。我在路径/ usr / local / lib中有共享库lcustom
。我在我的程序test.y
中使用该库中的函数,但它为libcustom.so
中定义的函数提供了未定义的引用。下面的makefile有什么问题。
all: test
test.tab.c test.tab.h: test.y
bison -d test.y
lex.yy.c: test.l test.tab.h
flex test.l
test: lex.yy.c test.tab.c test.tab.h test_util.c
gcc -lcustom -o test test.tab.c test_util.c lex.yy.c
clean:
rm test test.tab.c lex.yy.c test.tab.h
答案 0 :(得分:2)
自从我上次写一篇严肃的makefile
以来已经有很长时间了,如果我错了,请指出。
有一些方法可以通过使用隐式规则避免遇到此类问题:
.PHONY: all clean
LDFLAGS=-lcustom
CFLAGS= # your gcc options start here
all: test
test.tab.c test.tab.h: test.y
bison -d test.y
lex.yy.c: test.l test.tab.h
flex test.l
lex.yy.o: lex.yy.c
tast.tab.o: test.tab.c test.tab.h
test_util.o: test_util.c
test: lex.yy.o test.tab.o test_util.o
clean:
rm -f test test.tab.c lex.yy.c test.tab.h *.o
然后你避免了所有痛苦的事情。
一般来说,最好明确生成.o
文件,然后使用链接器处理它们,这样如果构建失败,你就会明确知道它有什么问题,特别是编译时错误或链接器错误。
关于你的问题的原因,我认为你应该把-lcustom
置于正确的位置以使其发挥作用。我很少看到人们在-l
之后立即放置gcc
标志,所以我很确定它不正确。我猜你应该把它放在最后。
PS:在我的评论中,nm
是一个列出目标文件中符号的工具。具体来说,在您的输出中,T
表示该函数位于文本段中并且已导出,因此应该能够进行链接。查看man nm
了解详情。