我的任务是将一个基于C++的古老代码从Unix环境迁移到Linux。该项目由多个Makefile组成,用于库的不同“模块”。我已经解决了一些问题,但是现在包含指令有问题。
显然,Makefile的构造方式是为不同的文件设置一个单独的包含指令,并且它在Unix服务器上工作了多年。
例如:
include ../../../../util/genmake.def
processControl.slOBJS = processControl.o
outputControlOBJS = outputControl.o
inputControlOBJS = inputControl.o
cleanList = *.o *.C *.out processControl.sl outputControl inputControl
all: processControl.sl outputControl inputControl
processControl.sl: $(processControl.slOBJS)
include ../../../../util/genmake.slinc
outputControl: $(outputControlOBJS)
include ../../../../util/genmake.exeinc
inputControl: $(inputControlOBJS)
include ../../../../util/genmake.exeinc
include ../../../../util/genmake.inc您可以在这里看到,选项卡式包含,只引用指定的目标!它们是实现这一目标的秘诀之一。
但是,这个构造在Linux中不起作用,我得到了以下错误:
include ../../../../util/genmake.slinc
make: include: Command not found
make: *** [processControl.sl] Error 127显然我不能只删除选项卡,因为包含应该只针对那个目标.
因此,我尝试用shell ' source‘命令替换它,以获取所包含的文件,如:
source ../../../../util/genmake.slinc这显然不起作用,而且我还试图将包含的代码直接导入包含文件(注释掉了include命令)--这将处理与Makefile相关的错误,但这不是一个好的解决方案,因为迁移和维护它是非常困难的,必须将相同的代码在整个项目中复制到所有模块中,当然,我必须对所有文件进行任何微小的更改。
有任何专家能就这个问题提出建议吗?此外,对于如何最好地完成这一迁移任务,任何建议通常都会受到欢迎:)
谢谢!
编辑-额外信息:genmake.slinc的内容:
#######################################################################
## This include will inherit the target and dependent files in
## a make file that inlcudes it.
## The inclusion of this file should look like:
##
## {target}: {dependent file list}
## include genmake.slinc
##
#######################################################################
@echo "----------------------------------------------------------------"
@echo " (G) Creating shared library $@ from $($(MaKeObJs:x=$(@)OBJS))";
@echo "----------------------------------------------------------------"
@echo "$(CPP) -b -o $@ $($(MaKeObJs:x=$(@)OBJS))"
@$(CPP) -b -o $@ $($(MaKeObJs:x=$(@)OBJS))
@echo " Moving shared library to $(SHLIBINSTALL) as lib$(@)"
@$(MV) $@ $(SHLIBINSTALL)/lib$(@)
@echo "----------------------------------------------------------------"这些都是标签。
现在genmake.exeinc的内容:
#######################################################################
## This include will inherit the target and dependent files in
## a make file that inlcudes it.
## The inclusion of this file should look like:
##
## {target}: {dependent file list}
## include /opt/app/fba/util/genmake.exeinc
##
#######################################################################
@cp $(SHLIBINSTALL)/* $(TEMP_SHLIB_DIR)/.
@echo "----------------------------------------------------------------"
@echo " (G) Linking $($(MaKeObJs:x=$(@)OBJS)) to make $@ "
@echo " LDOPTS set to: $(LDOPTS)"
# @echo " $(PURIFY) $(LD) "
@echo " SHLIB Temp Path: $(TEMP_SHLIB_DIR)
@echo " FBA libraries: $(FBALIB)"
@echo " Application libraries: $(APPLIBS)"
$(PURIFY) $(LD) -o $@ $($(MaKeObJs:x=$(@)OBJS)) \
$(CXXOPTS) \
$(LDFLAGS) \
$(FBALIB) \
$(PROLDLIBS) \
`cat /usr/local/opt/oracle/product/t1c3d771/lib/ldflags` \
`cat /usr/local/opt/oracle/product/t1c3d771/lib/sysliblist` \
$(APPLIBS)
@echo " Moving executable to $(EXEINSTALL) "
@$(MV) $@ $(EXEINSTALL)
@echo "----------------------------------------------------------------"如果我转到Makefile并删除包含上的前导选项卡,就会得到以下错误:././.././../util/genmake.slinc:10:*命令在第一个目标之前开始。停止播放。
发布于 2017-01-11 17:27:21
只需将目标作为变量添加到包含中:例如,genmake.exeinc将变成:
$(targetControl): $(depControlOBJS)
@cp $(SHLIBINSTALL)/* $(TEMP_SHLIB_DIR)/.
@echo "----------------------------------------------------------------"
@echo " (G) Linking $($(MaKeObJs:x=$(@)OBJS)) to make $@ "
@echo " LDOPTS set to: $(LDOPTS)"
# @echo " $(PURIFY) $(LD) "
@echo " SHLIB Temp Path: $(TEMP_SHLIB_DIR)
@echo " FBA libraries: $(FBALIB)"
@echo " Application libraries: $(APPLIBS)"
$(PURIFY) $(LD) -o $@ $($(MaKeObJs:x=$(@)OBJS)) \
$(CXXOPTS) \
$(LDFLAGS) \
$(FBALIB) \
$(PROLDLIBS) \
`cat /usr/local/opt/oracle/product/t1c3d771/lib/ldflags` \
`cat /usr/local/opt/oracle/product/t1c3d771/lib/sysliblist` \
$(APPLIBS)
@echo " Moving executable to $(EXEINSTALL) "
@$(MV) $@ $(EXEINSTALL)
@echo "----------------------------------------------------------------"然后修改makefile的相关部分如下:
#outputControl: $(outputControlOBJS)
targetControl=outputControl
depControlOBJS=$(outputControlOBJS)
include ../../../../util/genmake.exeinc
#inputControl: $(inputControlOBJS)
targetControl=inputControl
depControlOBJS=$(inputControlOBJS)
include ../../../../util/genmake.exeinchttps://stackoverflow.com/questions/41573148
复制相似问题