如何在liunx下编译一个调用到c语言开发的动态库(so文件)的fortran程序。

本文旨在记录一个学习在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

简单不罗嗦,大家都知道fortran函数的参数是传地址的,所以对应于c的话这个函数结构等同于extern void add_(float *a, float *b, float *c);

所以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来帮忙把这个步骤自动化起来:

(未完待续)

你可能感兴趣的:(计算机科学)