【发布时间】:2013-01-31 10:27:22
【问题描述】:
我有我最后一次在 90 年代后期 - 2000 年工作的源代码,并且除了 makefile 之外,我已经将它全部备份了(是的,糟糕的备份几乎和没有备份一样好):所以......我是想知道是否有任何自动生成 makefile 的方法或快速分析依赖关系的好方法?
我正在寻找:
- 一个可以为我分析依赖关系并更正链接顺序的工具。
- 如果不存在这样的问题,那么非常感谢过去曾遇到过类似问题的人就如何最好地解决此问题提出建议
- 如果上述两个选项都失败了,我认为最好的方法是创建一个分析/生成文件创建工具,它可以自动生成链接的依赖顺序(我推迟了这种方法,因为时间总是很短供应以挤入另一个项目)。
寻求帮助/建议的原因是代码库有 300,000 行代码(不包括 cmets)并且跨越数百个 C/O 文件,而且我经常尝试手动创建一个 make-file ,它令人沮丧和困惑,因此我最后一次尝试在这里寻求帮助和询问。
供参考: 我过去曾尝试过Cmake、AutoMake、GenMake 和类似的工具来生成makefile,但都无济于事,因为依赖是可怕的。
通用 makefile 脚本
因为它可能对其他人有用,这里是我通常用于不太复杂的 C 和 C++ 项目的 makefile,因为它让我不必担心每次都创建一个新的:
$(VERBOSE).SILENT:
PROGRAMNAME = prog
CC = gcc
CC += -c
CPP = g++
CPP += -c
ASM = nasm
ASM += -f elf -d ELF_TYPE
LD = g++
OBJFILES = $(patsubst %.c,%.o,$(wildcard *.c))
OBJFILES += $(patsubst %.s,%.o,$(wildcard *.s))
OBJFILES += $(patsubst %.cpp,%.o,$(wildcard *.cpp))
all: $(PROGRAMNAME)
clean:
@echo "Cleaning object files"
@echo " rm -f *.o"
rm -f *.o
@echo "Cleaning backups"
@echo " rm -f *~"
rm -f *~
@echo "Removing program file"
@echo " rm -f "$(PROGRAMNAME)
rm -f $(PROGRAMNAME)
%.o: %.s
@echo "Assembling ASMs "$@
@echo " ASM "$<
$(ASM) $<
%.o: %.c
@echo "(C)ompiling "$@
@echo " CC "$<
$(CC) $<
%.o: %.cpp
@echo "(C++)ompiling "$@
@echo " CPP "$<
$(CPP) $<
$(PROGRAMNAME): $(OBJFILES)
@echo "Get ready...."
@echo "Linking "$@
@echo " LD -o "$(PROGRAMNAME)" "$(OBJFILES)
$(LD) -o $(PROGRAMNAME) $(OBJFILES)
@echo "Cry if it worked! Scream swear and cry if it did not..."
strip: $(PROGRAMNAME)
@echo "Stripping "$(PROGRAMNAME)
echo -n "Size of "$(PROGRAMNAME)" before stripping is "
ls -sh $(PROGRAMNAME) | cut -d' ' -f1
@echo " Stripping "$(PROGRAMNAME)
strip $(PROGRAMNAME)
echo -n "Size of "$(PROGRAMNAME)" after stripping is "
ls -sh $(PROGRAMNAME) | cut -d' ' -f1
nothing:
@echo "Nothing to do; see you later - I'm going home!!!"
@echo "Hey, try some of these:"
@echo "make all - this would be the one you want"
@echo "make strip - does not work in the real world, only in computers"
@echo "make clean - will help clean your mind up"
【问题讨论】:
-
听起来你已经尝试了所有显而易见的工具;如果他们无法解决您的依赖关系,那么您可能需要做一些手动工作!
-
伟大时代的四个伟大答案:大家欢呼。非常感谢!
-
也许你应该从
gcc的-M标志开始获取源依赖项,然后逐个目录查找应该在那里做什么(仅编译,从外部链接,创建一个库或可执行文件)。也许ldd应用于可执行文件会告诉你一些事情。 -
Cheers Vonbrand: ldd 非常方便,我喜欢输出,非常适合在编译后跟踪我的代码 :) 使用仅 Windows 的编译器太久了,似乎忘记了我在遥控器上的 ssh 会话编码.