首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Makefile在从Unix迁移到Linux时包含指令

Makefile在从Unix迁移到Linux时包含指令
EN

Stack Overflow用户
提问于 2017-01-10 16:04:19
回答 1查看 568关注 0票数 5

我的任务是将一个基于C++的古老代码从Unix环境迁移到Linux。该项目由多个Makefile组成,用于库的不同“模块”。我已经解决了一些问题,但是现在包含指令有问题。

显然,Makefile的构造方式是为不同的文件设置一个单独的包含指令,并且它在Unix服务器上工作了多年。

例如:

代码语言:javascript
复制
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中不起作用,我得到了以下错误:

代码语言:javascript
复制
include ../../../../util/genmake.slinc
make: include: Command not found
make: *** [processControl.sl] Error 127

显然我不能只删除选项卡,因为包含应该只针对那个目标.

因此,我尝试用shell ' source‘命令替换它,以获取所包含的文件,如:

代码语言:javascript
复制
        source ../../../../util/genmake.slinc

这显然不起作用,而且我还试图将包含的代码直接导入包含文件(注释掉了include命令)--这将处理与Makefile相关的错误,但这不是一个好的解决方案,因为迁移和维护它是非常困难的,必须将相同的代码在整个项目中复制到所有模块中,当然,我必须对所有文件进行任何微小的更改。

有任何专家能就这个问题提出建议吗?此外,对于如何最好地完成这一迁移任务,任何建议通常都会受到欢迎:)

谢谢!

编辑-额外信息:genmake.slinc的内容:

代码语言:javascript
复制
#######################################################################
## 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的内容:

代码语言:javascript
复制
#######################################################################
## 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:*命令在第一个目标之前开始。停止播放。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-11 17:27:21

只需将目标作为变量添加到包含中:例如,genmake.exeinc将变成:

代码语言:javascript
复制
$(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的相关部分如下:

代码语言:javascript
复制
#outputControl: $(outputControlOBJS)
targetControl=outputControl
depControlOBJS=$(outputControlOBJS)
include ../../../../util/genmake.exeinc

#inputControl: $(inputControlOBJS)
targetControl=inputControl
depControlOBJS=$(inputControlOBJS)
include ../../../../util/genmake.exeinc
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41573148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档