Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
Fortran Makefile-已删除循环依赖项和m2c_Makefile_Fortran - Fatal编程技术网

Fortran Makefile-已删除循环依赖项和m2c

Fortran Makefile-已删除循环依赖项和m2c,makefile,fortran,Makefile,Fortran,以下是一个工作制作;这是一个更复杂版本的简化版本,但当我尝试一些更改时,它成功地再现了问题。文件“myobj.f”和“mymod.f”分别位于文件夹“src1”和“src2”中,几乎为空(mymod是一个声明了变量的模块,myobj是一个初始化和打印该变量的子例程) 我试着在谷歌上搜索这个,但我发现的所有循环依赖错误似乎都比这个更清楚。你能帮我找出我的makefile有什么问题吗 all : mylib.so makefiles := Makefile FC = gfortran FFLAGS

以下是一个工作制作;这是一个更复杂版本的简化版本,但当我尝试一些更改时,它成功地再现了问题。文件“myobj.f”和“mymod.f”分别位于文件夹“src1”和“src2”中,几乎为空(mymod是一个声明了变量的模块,myobj是一个初始化和打印该变量的子例程)

我试着在谷歌上搜索这个,但我发现的所有循环依赖错误似乎都比这个更清楚。你能帮我找出我的makefile有什么问题吗

all : mylib.so
makefiles := Makefile
FC = gfortran
FFLAGS = -I$(obj_path) -J$(obj_path) -fPIC
LFLAGS = -shared -fPIC

obj_path := obj
src_paths = src1 src2
vpath %.o   $(obj_path)
vpath %.mod $(obj_path)
vpath %.f   $(src_paths)

objects = myobj.o mymod.o
obj/myobj.o : obj/mymod.mod

mylib.so : $(objects:%.o=$(obj_path)/%.o)
        $(FC) $(LFLAGS) $^ $(LIBS) -o $@

$(obj_path)/%.mod : %.o
        @touch $@

$(obj_path)/%.o   : %.f   $(makefiles) |  $(obj_path)
        $(FC) $(FFLAGS) -c $< -o $@

$(obj_path) :
        mkdir -p $@

.PHONY: clean
clean:
        rm -rf mylib.so $(obj_path)
src2/mymod.f:

       module mymod
       implicit none
       integer :: mymodx
       end module
终端输出:

make --debug
GNU Make 4.1
Built for x86_64-unknown-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Reading makefiles...
Updating goal targets....
 File 'all' does not exist.
   File 'mylib.so' does not exist.
     File 'obj/myobj.o' does not exist.
make: Circular obj/myobj.mod <- obj/myobj.o dependency dropped.
       File 'obj/mymod.mod' does not exist.
         File 'obj/mymod.o' does not exist.
make: Circular obj/mymod.o <- obj/mymod.mod dependency dropped.
        Must remake target 'obj/mymod.o'.
m2c    -o obj/mymod.o 
make: m2c: Command not found
<builtin>: recipe for target 'obj/mymod.o' failed
make: *** [obj/mymod.o] Error 127
make--debug
GNU Make 4.1
为x86_64-unknown-linux-gnu构建
版权所有(C)1988年至2014年自由软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。
正在读取生成文件。。。
更新目标。。。。
文件“all”不存在。
文件“mylib.so”不存在。
文件“obj/myobj.o”不存在。

make:Circular obj/myobj.mod您的方法存在一些问题。
vpath
搜索只适用于先决条件,而不适用于目标,因此

%.o: %.f
将在
$(src\u路径)
中搜索源,但不会尝试匹配
$(obj\u路径)
中的目标。这导致了下一个问题,即由于将对象放入中间目录,您的规则需要对此进行解释,因为
vpath
没有帮助。您构建库的主要目标取决于
$(obj_path)/blah.f
等内容,因此您希望使用如下规则:

$(obj_path)/%.o: %.f
以匹配对象。也许有更干净的方法可以做到这一点,但我不知道他们

类似地,带有
%.mod
目标的规则与对象目录中的要求不匹配,似乎正在调用默认的隐式规则来处理它们,试图调用
m2c

具体来说,make尝试将mod文件编译为modula-2源代码,其自动规则与
%.o:%.mod
规则冲突,并生成循环依赖项。 通过修改该规则以正确匹配mod文件,可以避免这种混乱

另外,不要忘记为
%.f90
添加
vpath
,这样您的规则就可以找到这些源文件

我可以用这个稍加修改的Makefile成功地构建您的测试项目。我还使用了名为
.f90
的文件来说明它也解决了您的第二个问题

FC = gfortran
FFLAGS = -I$(obj_path) -J$(obj_path) -fPIC
LFLAGS = -shared -fPIC

src_paths = src1 src2
obj_path := obj
vpath %.o $(obj_path)
vpath %.mod $(obj_path)
vpath %.f90 $(src_paths)
vpath %.f $(src_paths)

mylib_objects = myobj.o mymod.o
mylib_target = mylib.so

all: $(mylib_target)

$(mylib_target) : $(mylib_objects:%.o=$(obj_path)/%.o)
    $(FC) $(LFLAGS) $^ $(LIBS) -o $@

$(obj_path)/myobj.o: myobj.f90 $(obj_path)/mymod.mod

$(obj_path) :
    mkdir -p $@

$(obj_path)/%.mod : %.o $(obj_path)
    @true

$(obj_path)/%.o: %.f | $(obj_path)
    $(FC) $(FFLAGS) -c $< -o $@

$(obj_path)/%.o: %.f90 | $(obj_path)
    $(FC) $(FFLAGS) -c $< -o $@

clean:
    rm -rf $(mylib_target) $(obj_path) 

还请注意,您可以通过在另一个文件中规定对象文件来处理模块依赖关系,以确保生成必要的mod文件。例如,改变

objects = myobj.o mymod.o


使涉及mod文件的规则和先决条件变得不必要,因为这将导致在尝试
myobj.o
之前生成
mymod.o
(以及副产品
mymod.mod
)。这个解决方案可能会在并行构建中中断,因此我维护了您的对象顺序,并确保规则按预期工作

您得到了
.mod->.o
/
.o->.mod
循环依赖项,而没有
vpath
行吗?我不知道会发生什么。这是什么版本的make?我在这里没有得到这个输出(只有
Makefile
src1/myobj.f
src2/mymod.f
文件)。我使用的是Make 4.1。在第一种情况下,我是这样做的。在第二种情况下,我只是尝试注释vpath行,现在我得到的是另一个错误:
make:**“obj/mymod.mod”所需的目标“obj/myobj.o”没有规则。停止。
。注意:当我对原始makefile中的
vpath
行进行注释时,我在编译时得到一行额外的代码,上面写着
gfortran-Iobj-Jobj-fPIC-c-o mymod.o src2/mymod.f
,在其他三行之前(包括使用我的规则再次编译mod:
gfortran-Iobj-Jobj-fPIC-c src2/mymod.f-o obj/mymod.o
).你能用不同尝试的精确生成文件和输出更新帖子吗?如果没有
vpath
行,我会发现没有规则问题,但我看不到make 4.1中的循环问题(确切地说是我之前列出的文件,空源文件)。好的,我现在更新。不过有两点意见:(1)你说空是什么意思?我的不是完全空的,它们有声明和使用语句。我将把它们包括在我的描述中。(2) 我正在从OSX下载到linuxbox中;我已经导出了LANG=C和LC_ALL=C,它们以前常常会导致问题,但没有发现任何迹象表明我当前的问题也可能与此相关。我的意思是在我的测试中,文件是空的(我只是提到它并不重要)。你做了哪些修改,以及为什么/如何解决问题?你能重现原来的问题吗?@EtanReisner是对的,我应该复制整个Makefile:我没有选择.F90!!我真傻,为那次错过道歉。好的,这解决了我的第二个问题;添加f90时,“make now”可以正常工作,这是最重要的部分,但我仍然不知道为什么需要在对象规则中添加
$(obj_path)/
。@Nordico vpath只对先决条件执行操作,而不是对目标执行操作。如果要避免规则中的
$(obj_path)/
,可以在编译对象的
obj
中放置一个Makefile,并从构建库的主Makefile调用该Makefile。有几种方法可以做到这一点,但我尽量靠近你的尝试,这就是我要做的;我的困惑并不完全在于vpath,我只是想在这里解释为什么它不是关于vpath的,呵呵。我的第一条规则中的替换项有
mylib。因此
依赖于
/obj/myobj.o
,如果规则只说
%.o:%.f
,那么它会查找
       module mymod
       implicit none
       integer :: mymodx
       end module
make --debug
GNU Make 4.1
Built for x86_64-unknown-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Reading makefiles...
Updating goal targets....
 File 'all' does not exist.
   File 'mylib.so' does not exist.
     File 'obj/myobj.o' does not exist.
make: Circular obj/myobj.mod <- obj/myobj.o dependency dropped.
       File 'obj/mymod.mod' does not exist.
         File 'obj/mymod.o' does not exist.
make: Circular obj/mymod.o <- obj/mymod.mod dependency dropped.
        Must remake target 'obj/mymod.o'.
m2c    -o obj/mymod.o 
make: m2c: Command not found
<builtin>: recipe for target 'obj/mymod.o' failed
make: *** [obj/mymod.o] Error 127
%.o: %.f
$(obj_path)/%.o: %.f
FC = gfortran
FFLAGS = -I$(obj_path) -J$(obj_path) -fPIC
LFLAGS = -shared -fPIC

src_paths = src1 src2
obj_path := obj
vpath %.o $(obj_path)
vpath %.mod $(obj_path)
vpath %.f90 $(src_paths)
vpath %.f $(src_paths)

mylib_objects = myobj.o mymod.o
mylib_target = mylib.so

all: $(mylib_target)

$(mylib_target) : $(mylib_objects:%.o=$(obj_path)/%.o)
    $(FC) $(LFLAGS) $^ $(LIBS) -o $@

$(obj_path)/myobj.o: myobj.f90 $(obj_path)/mymod.mod

$(obj_path) :
    mkdir -p $@

$(obj_path)/%.mod : %.o $(obj_path)
    @true

$(obj_path)/%.o: %.f | $(obj_path)
    $(FC) $(FFLAGS) -c $< -o $@

$(obj_path)/%.o: %.f90 | $(obj_path)
    $(FC) $(FFLAGS) -c $< -o $@

clean:
    rm -rf $(mylib_target) $(obj_path) 
% make --debug
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Reading makefiles...
Updating goal targets....
 File 'all' does not exist.
   File 'mylib.so' does not exist.
     File 'obj/myobj.o' does not exist.
       File 'obj' does not exist.
      Must remake target 'obj'.
mkdir -p obj
      Successfully remade target file 'obj'.
       File 'obj/mymod.mod' does not exist.
         File 'obj/mymod.o' does not exist.
        Must remake target 'obj/mymod.o'.
gfortran -Iobj -Jobj -fPIC -c src2/mymod.f90 -o obj/mymod.o
        Successfully remade target file 'obj/mymod.o'.
      Must remake target 'obj/mymod.mod'.
      Successfully remade target file 'obj/mymod.mod'.
    Must remake target 'obj/myobj.o'.
gfortran -Iobj -Jobj -fPIC -c src1/myobj.f90 -o obj/myobj.o
    Successfully remade target file 'obj/myobj.o'.
  Must remake target 'mylib.so'.
gfortran -shared -fPIC obj/myobj.o obj/mymod.o  -o mylib.so
  Successfully remade target file 'mylib.so'.
Must remake target 'all'.
Successfully remade target file 'all'.
objects = myobj.o mymod.o
objects = mymod.o myobj.o