本文旨在记录一个学习在liunx(在windows下没这么麻烦,微软做的很到位了)下用makefile来混合编译同时包含c/c++ 及fortran代码的程序的学习过程。
本学习过程基于百度文库:原文链接。当然我会在原文基础上作出取舍及添加个人心得,否则何以对得起原创二字。
在liunx下,编译及链接主要基于make及gcc。我们这里编译fortran,所以编译器还要引入ifort,fortran编译器有很多,ifort算是一个比较常用的。对fortran其他编译器有兴趣的请点击:fortran编译器资料链
先来一个简单的范例
一个c的main程序,调用一个fortran算法。
首先是fortran代码
subroutine add(a, b, c)
implicit none
real:: a, b, c
c = a + b
write(*,*) a, "+", b, "=", c
return
end subroutine add
所以c的代码如下
#include
extern void add_(float *a, float *b, float *c);
int main(int argc, char *argvs[])
{
float a, b, c;
a = 5.0;
b = 7.0;
add_(&a, &b, &c);
printf("c is %4.2f",c);
return 0;
}
好的,代码就这么简单,接下来让我们分别生成fortran和c的编译文件,然后link(本文不特别介绍如何下载安装gcc , g++及intel fortran编译器的步骤,那很简单)
编译fortran的命令是:ifort -w -c algofortran.f
其中这个 algofortran.f是fortran文件的文件名。
编译c的命令是: gcc -c main.c 理所当然main.c是c文件的文件名
以上两步会把两个源文件编译成两个.o文件,接下来用ifort -nofor-main *.o -o Run 命令将.o中间汇编代码linker为最终的执行程序Run
如果要把c改成c++代码,总体上也不难。这里fortran的代码不做变化,在c++调用fortran的函数时将其视作c格式(看得懂这句话就看得懂了,看不懂就算了,不重要)
#include
#include
extern "C" void add_(float *a, float *b, float *c);
using namespace std;
int main(int argc, char *argvs[])
{
float a, b, c;
a = 5.0;
b = 7.0;
add_(&a, &b, &c);
cout << c << endl;
return 0;
}
可以看到 extern和void之间多了个“C”,这是表示按照c的格式调用,一般跨语言调用都是按照c的格式,所以各位看官不用太费心思在这个点上了。
之后的编译命令中,编译fortran的命令不变,编译c的命令要改成编译c++的命令: g++ -c main.c
同时链接命令需要改为 ifort -nofor-main *.o -lstdc++ -o Run,改成c++后主要是需要添加一些c++的类库,命令是-l 这里添加了std(因为using了std)
以上步骤都是一步一步手动编译,很明显如果经常改代码经常重复编译,每个.o文件每次都手动来做未免太累了,那就看看如何用makefile来帮忙把这个步骤自动化起来:
(未完待续)