Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以用正确的链接顺序和依赖项为C项目重新生成makefile吗?_C_Linux_Unix_Makefile - Fatal编程技术网

我可以用正确的链接顺序和依赖项为C项目重新生成makefile吗?

我可以用正确的链接顺序和依赖项为C项目重新生成makefile吗?,c,linux,unix,makefile,C,Linux,Unix,Makefile,我上一次编写的源代码是在90年代末-2000年,并且已经备份了所有的源代码,除了makefile(是的,请记住,坏的备份几乎和没有备份一样好):所以。。。我想知道是否有自动生成makefile的方法,或者快速分析依赖关系的好方法 具体而言,我正在寻找: 这是一个可以为我分析依赖关系和纠正链接顺序的工具 如果不存在此类问题,则非常感谢过去有过类似问题的人就如何最好地解决此问题提出的建议 如果上述两个选项都失败,我认为最好的方法是创建一个分析/生成文件创建工具,该工具可以自动生成链接的依赖项顺序(

我上一次编写的源代码是在90年代末-2000年,并且已经备份了所有的源代码,除了makefile(是的,请记住,坏的备份几乎和没有备份一样好):所以。。。我想知道是否有自动生成makefile的方法,或者快速分析依赖关系的好方法

具体而言,我正在寻找:

  • 这是一个可以为我分析依赖关系和纠正链接顺序的工具
  • 如果不存在此类问题,则非常感谢过去有过类似问题的人就如何最好地解决此问题提出的建议
  • 如果上述两个选项都失败,我认为最好的方法是创建一个分析/生成文件创建工具,该工具可以自动生成链接的依赖项顺序(我一直没有采用这种方法,因为时间总是不够,无法挤进另一个项目)
寻求帮助/建议的原因是,代码库是300000行代码(不包括注释),跨越数百个C/O文件,而且当我尝试手动创建make文件时,经常会遇到挫折和困惑,因此我最后一次尝试在这里寻求帮助和询问

供参考:我曾经尝试过、AutoMake和类似的工具来生成makefile,但都没有效果,因为依赖关系非常可怕


通用生成文件脚本

因为它可能对其他人有用,这里是我通常用于较少复杂的C和C++项目的MaFILE文件,因为它节省了我每次都需要担心创建一个新的:

$(详细)。无提示:
PROGRAMNAME=prog
CC=gcc
CC+=-c
CPP=g++
CPP+=-c
ASM=nasm
ASM+=-f elf-d elf_类型
LD=g++
OBJFILES=$(patsubst%.c、%.o、$(通配符*.c))
OBJFILES+=$(patsubst%.s、%.o、$(通配符*.s))
OBJFILES+=$(patsubst%.cpp、%.o、$(通配符*.cpp))
全部:$(程序名)
清洁:
@回显“清理对象文件”
@回声“rm-f*.o”
rm-f*.o
@回显“清理备份”
@回音“rm-f*~”
rm-f*~
@回显“删除程序文件”
@echo“rm-f”$(程序名)
rm-f$(程序名)
%.o:%.s
@呼应“组装ASM”$@
@回音“ASM”$<
$(ASM)$<
%.o:%.c
@“回声”(C)ompiling”$@
@回声“CC”$<
$(CC)$<
%.o:%.cpp
@echo“(C++)ompiling”$@
@回声“CPP”$<
美元(CPP)$<
$(程序名):$(OBJFILES)
@echo“准备好……”
@回声“链接”$@
@echo“LD-o”$(程序名)“$(OBJFILES)
$(LD)-o$(程序名)$(OBJFILES)
@echo“如果成功就哭!如果失败就尖叫、发誓、哭泣…”
条带:$(程序名)
@echo“剥离”$(程序名)
echo-n“剥离前的“$(程序名)”大小为”
ls-sh$(程序名)| cut-d'-f1
@echo“剥离”$(程序名)
strip$(程序名)
echo-n“剥离后的“$(程序名)”大小为”
ls-sh$(程序名)| cut-d'-f1
没有什么:
@echo“无事可做,待会儿见-我要回家了!!!”
@echo“嘿,试试这些:
@echo“全部制作-这将是您想要的”
@echo“制作条带-在现实世界中不起作用,只在计算机中起作用”
@echo“清理-将有助于清理您的头脑”

gcc&clang可以生成依赖项,请参见,这不会解决整个问题,但会对您有所帮助。

您正在寻找麻省理工学院的经典Unix工具,在linux/Unix系统上:

find-名称“*.c”-print>sources
将为您提供所有源的列表

find-名称“*.c”-print | sed s/\.c/\.o>objects
应提供一个列表,您可以将“objects=”粘贴在[可能手动添加一些换行符]前面

cat sources | xargs gcc-M>myprog.deps
应该为您提供一个头依赖项列表,您可以
将myprog.deps
包含在makefile中。[1]

现在你只需要 TARGET=myprog#无论你称之为什么程序

OBJECTS = ... # from "objects" file above. 
SOURCES = ... # from "sources" file above

INCLUDES = -I subdir1 -I subdir2 ...     # include directories used by this product

CFLAGS = ... ${INCLUDES} # Some suitable settings
CC = gcc
LD = ${CC}
LDFLAGS =  ...    # I don't know what this needs to be - usually nothing complicated.

all: ${TARGET}

clean:
    rm -f ${TARGET} ${OBJECTS}

${TARGET}: ${OBJECTS}
    ${LD} -o $@ ${OBJECTS}

.c.o:
    ${CC} -o $@ $<

感谢您的回复:简洁且信息量大。基于这些答案,我现在使用人工和(makedepend的现代继承者)的混合方式来尝试重新编译,到目前为止似乎相当有效

然后将是在C++中移植到OO代码的乐趣和游戏……这是一个我乐意回避但必须必须完成的任务。


再次感谢

听起来你已经尝试了所有显而易见的工具;如果他们不能解决您的依赖关系,那么您可能需要做一些手工工作!伟大时刻的四个伟大答案:为大家干杯。非常感谢!也许您应该从
gcc
-M
标志开始获取源依赖项,然后逐个目录查找应该在那里执行的操作(仅编译、从外部链接、创建库或可执行文件)。也许应用于可执行文件的
ldd
会告诉你一些事情。Cheers Vonbrand:ldd非常方便,我喜欢输出,有助于跟踪编译后的代码:)使用纯windows编译器太久了,似乎忘记了远程上的ssh会话编码。链接很棒,我不敢相信我没有意识到这个工具,因为它几乎完全符合我的需要:)为解释得很好的makefile干杯:)也给了我一些重构自己的makefile的想法。
myprog.deps: ${SOURCES}
    ${CC} -MM ${SOURCES} > myprog.deps

include myprog.deps