gpt4 book ai didi

C/C++、FORTRAN、下划线和 GNU Autotools

转载 作者:行者123 更新时间:2023-12-05 01:35:29 25 4
gpt4 key购买 nike

我有一个关于混合语言编程(C/C++ 和 FORTRAN)的问题使用 gcc 和 gfortran。我搜索了很多“将 fortran 与语言 X”,但未能解决此问题。

我不确定这是链接问题还是编译器问题,或者两者兼而有之。

我已经创建了三个文件,并且正在使用 GNU Autotools 构建粗糙的应用程序,但应该能够从命令构建应用程序独立行。

C 文件 (main.c) 将是驱动应用程序,调用多个FORTRAN 函数:

/* this is a simple program */

#include <stdio.h>

/* add the extern function definition */
#include "fooonly.h"

// this is not working for the mixed language programming stuff yet...

/* this is the main program section */
int main( int argc, char *argv[] )
{
int a = 36;
int b = 24;
int c = 0;

printf( "hi mom\n" );

/* now call a FORTRAN function from C */
c = NGCD( &a, &b );
printf( "NGCD(%d,%d)=%d\n", a, b, c );

return 0;

最常包含 FORTRAN 77 的 fortran 函数(但也可以包括 FORTRAN90/95 代码),看起来像:

c$$$      The following introductory example in FORTRAN 77 finds the
c$$$ $ greatest common divisor for two numbers A and B using a
c$$$ $ verbatim implementation of Euclid's algorithm.

FUNCTION NGCD(NA, NB)
IA = NA
IB = NB
1 IF (IB.NE.0) THEN
ITEMP = IA
IA = IB
IB = MOD(ITEMP, IB)
GOTO 1
END IF
NGCD = IA
RETURN
END

使用开发。 Studio 6/Compaq Digital Fortran 6.0,工作正常。在事实上,我不必使用 #define ifdef __cplusplus/#endif 并且可以只需创建一个如下所示的 C 文件:

/* this is a simple program */

#include <stdio.h>

/* add the extern function definition */
extern "C" int __stdcall NGCD( int *a, int *b );

/* this is the main program section */
int main( int argc, char *argv[] )
{
int a = 36;
int b = 24;
int c = 0;

printf( "hi mom\n" );

/* now call a FORTRAN function from C */
c = NGCD( &a, &b );
printf( "NGCD(%d,%d)=%d\n", a, b, c );

return 0;
}

并用上面的 FORTRAN 列表编译它,应用程序链接,运行,并生成正确的结果。

C:\fooonly>fooonly.exe
hi mom
NGCD(36,24)=12

C:\fooonly>

当我尝试在 MinGW 上使用 GNU Autotools 或OSX,我继续收到以下错误:

macbook:makecheck $ make
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"fooonly\" -DVERSION=\"1.0.2\" -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gfortran -g -O2 -o fooonly main.o ngcd.o
Undefined symbols for architecture x86_64:
"_NGCD", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [fooonly] Error 1
macbook:makecheck $

其中 Makefile(由 GNU Autotools 生成),基本上包含以下命令:

macbook:makecheck $ gcc -c main.c
macbook:makecheck $ gfortran -c ngcd.f
macbook:makecheck $ gcc -o fooonly main.c ngcd.o
Undefined symbols for architecture x86_64:
"_NGCD", referenced from:
_main in cc9uPBWl.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
macbook:makecheck $

我的 configure.in 脚本仅包含:

AC_INIT(main.c)
AM_INIT_AUTOMAKE(fooonly, 1.0.2)

## C/C++ compiler section
AC_PROG_CC

## fortran section
AC_PROG_F77

## output section
AC_OUTPUT(Makefile)

本质上,

macbook:makecheck $ gcc -c main.c
macbook:makecheck $ gfortran -c ngcd.f
macbook:makecheck $ gcc -o fooonly main.c ngcd.o

对吗?

我正在尝试在多个平台(Linux、Win32/64、OSX、等)并希望使用 GNU Autotools,我知道这是通过其他开源项目,但那些的 configure.in 脚本项目远远超出了我的 GNU Autotools 新手能力,我得到了试图解码它们有点不知所措。

我猜这与以下内容有关:

1) 我在 configure.in 脚本中使用的定义,2)我不包括一些神奇的开关(即 -fno-second-underscore?),或3) 两者的某种结合?

我完成了吗?如果是,我该如何构建应用程序?

最佳答案

只要您拥有比过去几年更新的编译器,我建议您使用 ISO C 绑定(bind)将 Fortran 与其他语言混合使用。然后您可以跳过带有下划线的名称修改和类似的编译器/平台相关问题。如果您有不想更改的遗留 FORTRAN 77 代码,您可以在 C 和 FORTRAN 77 之间编写一个小的 Fortran 2003 粘合例程。旧的说明描述了以前的方法,它需要更多地了解内部接口(interface)并且更依赖于编译器/平台。对于新方法,请在此处查看 gfortran 手册章节“混合语言编程”和以前的问题/答案。

使用 Fortran 代码可以更轻松地与 gfortran 链接,因为这会引入 Fortran 运行时库。我认为这同样适用于 C++,因此如果您同时拥有两者,则必须显式包含一个或另一个的运行时库。

附言下面是一个使用 Fortran ISO C 绑定(bind)的示例:

function NGCD (na, nb) bind (C, name="NGCD")
use iso_c_binding
implicit none
integer (c_int) :: ngcd
integer (c_int), intent (in) :: na, nb
integer (c_int) :: ia, ib, itemp
ia = na
ib = nb

do while (ib /= 0)
itemp = ia
ia = ib
ib = mod(itemp, ib)
end do

ngcd = ia

return
end function NGCD

编译/链接:

gcc -c main.c
gfortran main.o ngcd.f90

关于C/C++、FORTRAN、下划线和 GNU Autotools,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8637996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com