在为了简化我的应用程序/库构建而写的master make文件中,我使用的解决方案是运行链接步骤两次。使用-u链接器选项在第二个链接上指定未定义的符号。
在我的make文件我有这样一个目标:
undefined.txt:
@$(generate-undefined-syms)
调用该宏...在链接的第一次尝试......
define generate-undefined-syms
$(PRINTF) "$(this_makefile): Generating undefined symbols ... \n"
$(CC) -o rubbish $(LDFLAGS) $(objects) $(LDLIBS) 2>&1 | $(GREP) 'undefined reference' > tmp.txt; \
$(SED) 's/^.*`/-Wl,-u/g' <tmp.txt> undefined.txt; \
rm -f tmp.txt rubbish
endef
正如我的SED /正则表达式技巧不好(我急着写这个东西),我最终得到了未定义。含有TXT:
-uSomeSym'
-uSomeOtherSym'
即具有尾随'
我然后使用这个补充语法来剥离的,并删除重复
undefined_references = $(filter-out follow, $(sort $(subst ',,$(shell cat undefined.txt))))
的‘关注’过滤器是因为,如果一个未定义的符号被多次引用,输出中会出现“更多引用XXX跟随”的消息,这会导致undefined.txt文件中出现假“跟随”,例如
-Wl, uXXXX' follow
最后我链接第二次(注意undefined.txt的依赖)
$(application): $(library_dependencies) $(objects) undefined.txt
$(CC) -o [email protected] $(LDFLAGS) $(undefined_references) $(objects) $(LDLIBS)
我最好的方式完全推荐下面的书,因为我能够从头开始写简单的构建系统在几天内。
管理与GNU项目制作,第三版 人:罗伯特·梅克伦堡
请为更多信息哪些功能是在C文件中,哪些得到了一个未定义的引用(以及您是否从另一个对象美其名曰该库或其他对象中的文件)。 – paxdiablo 2010-07-10 11:18:05