首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Makefile -来回编译

Makefile -来回编译
EN

Stack Overflow用户
提问于 2012-10-15 18:30:58
回答 2查看 171关注 0票数 2

以下是我的项目的目录结构:

代码语言:javascript
复制
                       expt-main
                       ---------
                       Makefile_main
                    /             \
         subdir-1                    subdir-2
         --------                    --------
         Makefile_1                  Makefile_2
         mod_codeA.f90               mod_code1.f90
         mod_codeB.f90               mod_code2.f90
         mod_codeC.f90               mod_code3.f90

Makefile_main:

代码语言:javascript
复制
export

SHELL = /bin/sh

F90     = mpxlf95

SRCDIRS = $(subdir-1) $(subdir-2)

all:
        @for DIR in ${SRCDIRS} ;

          do \
            back=`pwd`; \
            cd $$DIR ;\
            $(MAKE) ; status=$$? ; \
            if [ $$status != 0 ] ; then \
              echo "Exit status fro make was $$status" ; exit $$status ; \
            fi ; \
            cd $$back ; \
         done

-------------------------------------------------------------------------------

Makefile-1:

%.o: %.f90
        $(F90) $(F90FLAGS) -I$(subdir-2) -c $<

mod_codeA.o: mod_codeC.o $(subdir-2)/mod_code2.o

-------------------------------------------------------------------------------

Makefile-2:

PROG = $(exec)

subdir-1_objs = $(subdir-1)/mod_codeA.o mod_codeB.o mod_codeC.o

all: $(PROG)

$(PROG): $(subdir-2_objs) $(subdir-1_objs) -o $@ $(subdir-2_objs) $(subdir-1_objs)

---------------------------------------------------------------------------------

-

我已经编写了Makefile_main,以便它首先编译子目录-1中的代码(模块),然后编译子目录-2中的代码,最后生成可执行文件。问题: subdir-1中的模块使用subdir-2中的模块,subdir-2中的模块以类似的方式使用subdir-1中的模块。我的make失败了,因为正在使用的模块在其他目录中。如何编写一个makefile来解决这个问题,也就是说,当在subdir-1中编译模块时,当它遇到需要subdir-2中的目标文件时,它应该切换到subdir-2编译必要的模块并返回subdir-1进行进一步的操作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-15 21:27:29

如果不同子目录中的模块像您所说的那样相互需要,那么这不是递归Make的好用法。

去掉Makefile-1Makefile-2,让Makefile_main来做所有的工作。(我不能具体告诉你如何改变Makefile-main,因为我不做Fortran,我不理解Makefile-2,而且我没有看到subdir-2中的模块对subdir-1中的模块有任何依赖)。

票数 2
EN

Stack Overflow用户

发布于 2012-10-16 18:48:01

如果你想坚持这种目录布局,并且仍然保留三个独立的Makefile,那么你可以使用编译器标志来指示FORTRAN编译器将模块文件放入你选择的公共目录中。

例如,使用:

代码语言:javascript
复制
$ gfortran --version
GNU Fortran (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.

您可以使用-I-J标志指示编译器执行以下操作:

  1. 搜索模块文件的位置(.mod)
  2. 放置生成的模块文件的位置

也就是说,我认为Beta给出的加入Makefile的建议很有意义。要了解你应该这样做的一些原因,你可以阅读this paper

最后,由于您的项目在这个阶段似乎不是很大,我还建议考虑将CMake作为构建系统,因为它可能提供一种更方便的方式来指定目标之间的依赖关系(以及许多其他内容)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12893738

复制
相关文章

相似问题

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