Makefile链接到库

时间:2015-08-06 23:49:28

标签: c makefile

我有以下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 

1 个答案:

答案 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了解详情。