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

2024-01-22

我有关于混合语言编程(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 函数最常包含 FORTRAN 77(但是 也可以包含 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

right?

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

我猜这与以下内容有关:

1)我在configure.in脚本中使用的定义, 2)我不包括一些神奇的开关 (即 -fno-第二个下划线?),或者 3)两者的某种组合?

我已经接近了吗?如果是,我该如何构建应用程序?


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

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

附:以下是使用 Fortran ISO C 绑定的示例:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++、FORTRAN、下划线和 GNU Autotools 的相关文章

  • 运行应用程序时.NET 3.5 JIT 不工作

    以下代码在 Visual Studio 内部运行该版本和在 Visual Studio 外部运行该版本时提供不同的输出 我正在使用 Visual Studio 2008 并面向 NET 3 5 我也尝试过 NET 3 5 SP1 在 Vis
  • C# - Visual Studio 中的 System.OutOfMemoryException

    我遇到问题 当我右键单击 Visual Studio 中的主窗体并转到 视图设计器 时 出现错误 它说 引发了 System OutOfMemoryException 类型的异常 堆栈跟踪 at System Reflection Asse
  • BufferBlock 连续

    我想使用以下方式实现消费者 生产者模式BufferBlock
  • 尽管浮点数相同,但它们并不相等? [复制]

    这个问题在这里已经有答案了 下面的程序输出This No is not same 当两个数字相同时为什么会这样做 void main float f 2 7 if f 2 7 printf This No is same else prin
  • 如何在 ASP.NET Core 6.0 Web API 项目中启用 cors?

    在我的 ASP NET Core 6 0 Web API 项目中配置了 CORS 但预检请求收到 http 405 错误 换句话说 不允许使用 HTTP OPTION 看起来 cors 没有启用 我见过的例子config EnableCor
  • 为什么我在 WinForms 列表框中得到“System.Data.DataRowView”而不是实际值?

    每当我运行代码并尝试查看highscore我在列表框中得到的只是System Data DataRowView 谁能明白为什么吗 Code MySqlConnection myConn new MySqlConnection connStr
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • C#生成的csv文件通过电子邮件发送嵌入到Lotus Note中电子邮件的底部

    我遇到了一个奇怪的问题 即使用 NET SmtpClient 通过电子邮件发送的 CSV 附件出现在电子邮件底部 而不是 Lotus Note 中的附件 我只是不知道如何解决这个问题 而且我无法访问客户端计算机 这使得调试非常困难 我可以采
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 为什么 rand() 总是返回相同的值? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中生成随机数 https stackoverflow com questions 3067364 generating random numbers in c 使用 rand 生成随机数 http
  • 确定相关词的编程方式?

    使用网络服务或软件库 我希望能够识别与词根相关的单词 例如 座位 和 安全带 共享词根 座位 但 西雅图 不会被视为匹配 简单的字符串比较对于这类事情似乎是不可行的 除了定义我自己的字典之外 是否有任何库或 Web 服务不仅可以返回单词定义
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • 如何在 ASP.NET Core 项目中使用 MStest 测试 Ok() 结果

    我正在使用 MStest 来测试我的控制器 我想测试这个动作 HttpGet Name GetGroups public async Task
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 如何在 SQLite 中检查数据库是否存在 C#

    我目前正在用 C 编写一个应用程序 并使用 sqlite 作为嵌入式数据库 我的应用程序在启动时创建一个新数据库 但如何让它检查数据库是否存在 如果它确实存在 我如何让它使用它 如果不存在如何创建一个新数据库 这是我到目前为止所拥有的 pr
  • 使用方法的状态模式

    我正在尝试使用方法作为状态而不是类来基于状态模式的修改版本来实现一个简单的状态机 如下所示 private Action
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • C# 和断点 - 这里有魔术师吗?

    我有这个 public static void ByLinkText string text for var i 0 i lt 50 i try Setup Driver FindElement By LinkText text Click
  • 在两个点之间创建一条曲线,每个点都具有标准化向量

    因此 我需要一种写入方法来在两点之间创建一条曲线 每个点都有一个指向任意方向的归一化向量 我一直在尝试设计这样一种方法 但一直无法理解数学 在这里 由于一张图片胜过一千个文字 这就是我所需要的 在图中 矢量垂直于红线 我相信向量需要进行相同
  • 是否可以检测流是否已被客户端关闭?

    简要介绍一下情况 我有一项服务可以通过套接字接收信息并发送回复 连接不安全 我想设置另一个可以为这些连接提供 TLS 的服务 这个新服务将提供单个端口并根据提供的客户端证书分发连接 我不想使用 stunnel 有几个原因 其中之一是每个接收

随机推荐

  • 无法将类型“System.Web.Mvc.RedirectToRouteResult”隐式转换为“System.Web.Mvc.JsonResult”

    我如何将操作从 JsonResult 重定向到 ActionResult 但出现错误 我的错误是 无法将类型 System Web Mvc RedirectToRouteResult 隐式转换为 System Web Mvc JsonRes
  • pthread 与 python VM 的回调

    假设我有一个 python 脚本 它通过 ctypes 加载共享库 SL SL 设置了一个pthread T1 python 脚本通过 SL 配置回调 即 python 脚本通过引用 python 可调用项从 SL 调用函数 替代文本 ht
  • 如何通过互联网使用 MQTT?

    目前 我正在成功运行一个 mosquitto 代理 订阅主题并与本地网络中的客户端发布消息 如何与位于不同 IP 地址的另一个本地网络进行通信 我应该设置 2 个 mosquitto 经纪人 每个本地网络一个吗 其他本地网络中的 PC 需要
  • 以编程方式为本地存储库创建 NuGet 包

    我正在编写一个控制台应用程序来创建 NuGet 包 使用 Nuget Core 库 该包将托管在我们的内部服务器上以部署到我们的应用程序中 当我们使用 NuGet Package Explorer 手动创建包时 这一切都可以正常工作 但我们
  • XAML 解析器如何识别 NameScope?

    在 XAML 解析的上下文中 我想知道解析器如何知道类型何时定义 NameScope 它是否完全依赖于 INameScope 接口 检查instance is INameScope 它是否依赖于布尔属性 XamlType IsNameSco
  • 复合主键+外键

    我有一个包含调查列表的表 PK 是 ID CREATE TABLE dbo SurveyMaster ID nvarchar 4 NOT NULL Title nvarchar 200 NULL IsActive bit NOT NULL
  • iBeacons:如何获取广播信标功率(txPower)

    iBeacons 似乎广播其 txPower 参数 报告 1 米距离处的 RSSI 功率 该参数用于计算beacon accuracy and beacon proximity属性 有关 iBeacon 广告包的详细信息 请参见here h
  • 如何防止 ion-checkbox 选择相同的项目值?

    这是一个手风琴列表菜单 在菜单的第三层 我为每个项目放置了一个复选框 此代码已经从所选项目中获取了值 但问题是当我取消选择时 它会让我获取其值 如何防止复选框选择相同的项目并在选择后取消 表单 html
  • scrapy单个蜘蛛将多个项目类传递到管道

    我是 scrapy 新手 在 items py 中 我声明了 2 个 ItemClass 分别称为 ItemClass1 和 ItemClass2 蜘蛛方法 parseUrl 获取 html 并抓取数据并将其放入相应项目类的列表中 e g
  • Corda:错误=org.hibernate.InstantiationException:没有实体的默认构造函数

    我遇到了一个问题 请帮忙 基于 M13 的 Corda 代码 我的架构代码主要用于定义架构来引用您的示例 object LegalContractSchemaV1 MappedSchema schemaFamily LegalContrac
  • jQuery - 从 DOM 中删除元素时触发事件

    我试图弄清楚当从页面中删除元素时如何执行一些js代码 jQuery some element remove remove some element from the page need to figure out how to indepe
  • PHP file_get_contents 与 php 完好无损吗?

    与使用 include 不同 include 执行文件中包含的 php 是否可以将 php 文件的内容保存到变量中 但 php 仍然完整且可执行 我的目标看起来像这样 template some imaginary include func
  • 如何获得从1到N随机排序的数字数组?

    下面的代码生成一个数组N整数随机数并将结果存储在random int array N 20 allocate array N 2 call random seed call random number array random int ar
  • 响应UIWebView点击动作调用原生代码页面

    我正在寻找一种方法来监听 UIWebView 中的操作 例如 当我点击 UIWebView 内的链接或按钮时 我想调用一个新的本机组件 例如评论页面 或者 采取其他一些操作 例如更改导航栏项目 是的 你可以这样做 实施 webView sh
  • 使 ParallelEnumerable.OrderBy 稳定排序

    我正在使用对象的整数 id 并行对对象列表进行排序OrderBy 我有一些具有相同 id 的对象 并且需要排序保持稳定 根据微软的文档 https learn microsoft com en us dotnet api system li
  • 编译时不断出现java: invalid source release: 1.9错误

    我尝试使用该网站上的各个论坛来解决此问题 但没有任何帮助 我尝试了与修复其他人的 1 8 错误类似的技术 但没有任何效果 我的源文件夹下有我的 java 类文件 没有导入 我只是想要一个基本的输出消息来确保 intelliJ 正常工作 有人
  • 对象上的 Scala F 有界多态性

    我无法在 Scala 中编写以下 F 界多态性 为什么 trait X T lt X T object Y extends X Y 我该如何表达并使其编译 看来你确实应该能够写作 trait X T lt X T object Y exte
  • 抑制 django 天真的日期时间警告

    我关心涉及日期时间模块的脚本 我必须抑制 时区处于活动状态时对象收到一个简单的日期时间 因为脚本中还有其他打印语句 我的代码如下 script from datetime import datetime date datetime now
  • gcc/diab:保留未使用的函数/部分

    我有一个项目 我想在链接阶段保留某些功能 部分 I tried static void stub enforcer void attribute used 但这是针对编译器的 而不是针对链接器的 现在链接器负责并使用了 gc section
  • C/C++、FORTRAN、下划线和 GNU Autotools

    我有关于混合语言编程 C C 和 FORTRAN 的问题 使用 gcc 和 gfortran 我搜索了很多 将 fortran 与 语言 X 并且无法解决这个问题 我不确定这是链接问题还是编译器问题 或者两者兼而有之 我创建了三个文件 并使