2013-04-30 78 views
0

這是我第一次創建make文件。我有點困惑,因爲我的Fortran代碼使用C源文件中定義的一些函數。這是我迄今寫的:Makefile與Fortran和C混淆

 CC = icc 
     FC = ifort 
     FCFLAGS = -O3 -xHost -fno-alias$(INCLUDES) 
     CFLAGS = -O3 -xHost -fno-alias$(INCLUDES) 
     LIBS = 
     INCLUDES = 
     TARGET = run 
     OBJS: pi.o\ 
     timing.o 
     timing.o: timing.c timing.h 
    $(CC) -c $(CFLAGS) timing.c 
      pi.o: pi.f90 timing.c timing.h 
     $(FC) -c $(FCFLAGS) timing.o pi.f90 
      .PHONY : clean 
      clean: rm -f *.o 

我在正確的軌道上嗎?

+0

請務必使用標籤[tag:fortran],並在必要時添加版本以區分您的問題是否具體。例如,你不能使用Fortran 2008,但只能使用Fortran 90. – 2015-12-17 11:48:45

回答

0

pi.o要求timing.o,而不是timing.c timing.h,在你的fortran食譜中交換兩個。應該是這樣的:

pi.o: pi.f90 timing.o 
     $(FC) -c $(FCFLAGS) timing.o pi.f90 
+0

好的,謝謝你的迴應。除了你提到的那點,makefile看起來是否合理? – gmajal 2013-04-30 20:41:22

+0

我沒有嘗試過將fortran和C結合起來。當試圖找到示例時(搜索[fortran with c]),看起來好像建議編譯每個目標文件(* .o)然後編譯成可執行文件。最佳參考我可以找到:http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html和搜索「FORTRAN程序調用C函數」。 – Greg 2013-04-30 21:14:17

1

你有很多的問題,你的makefile,加上編譯不同.o文件時,你可以不包括.o文件。 .o文件只發送給鏈接器,但使用-c標誌來ifort告訴它創建一個對象並且不是鏈接它。順便說一句,它會幫助我們理解你的問題,如果你正確地格式化示例:你的空白非常奇怪,使閱讀困難。

我想你想要這樣的東西;這會構建一個名爲「run」的程序。

CC = icc 
FC = ifort 
FCFLAGS = -O3 -xHost -fno-alias $(INCLUDES) 
CFLAGS = -O3 -xHost -fno-alias $(INCLUDES) 
LIBS = 
INCLUDES = 
TARGET = run 
OBJS = pi.o timing.o 

$(TARGET) : $(OBJS) 
     $(FC) -o $(TARGET) $(OBJS) 
timing.o: timing.c timing.h 
     $(CC) -c $(CFLAGS) timing.c 
pi.o: pi.f90 
     $(FC) -c $(FCFLAGS) pi.f90 
.PHONY : clean 
clean: 
     rm -f *.o 

或者,如果你想用化妝的一些花哨的功能,避免打字,你可以使用:

CC = icc 
FC = ifort 
FCFLAGS = -O3 -xHost -fno-alias $(INCLUDES) 
CFLAGS = -O3 -xHost -fno-alias $(INCLUDES) 
LIBS = 
INCLUDES = 
TARGET = run 
SRCS = pi.f90 timing.c 

timing.o: timing.h 

OBJS = $(addsuffix .o,$(basename $(SRCS)) 

$(TARGET) : $(OBJS) 
     $(FC) -o [email protected] $^ 
%.o: %.c 
     $(CC) -c $(CFLAGS) -o [email protected] $< 
%.o: %.f90 
     $(FC) -c $(FCFLAGS) -o [email protected] $< 

.PHONY : clean 
clean: 
     rm -f *.o 

這看起來更長的時間,但如果/當你需要添加更多的源文件你所要做的就是把它們放到SRCS變量中(並聲明任何額外的先決條件)。