- 302
- 0
题目描述
QT+VS2017 无法调用Fortran生成的DLL
题目来源及自己的思路
自己学习中遇到的问题,当时以为是路径的问题,但是我用绝对路径也不行,把dll文件拷到exe目录也不行。
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
1、用LoadLibrary()
#include "Test00.h"
#include<Windows.h>
#include<qmessagebox.h>
typedef int(*FUNCTIONABZERO)(int input);
Test00::Test00(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
loadDll = LoadLibrary(TEXT("C:\VisualStudioWorkspace\QtStudy\Test00\Test00\TestDll.dll"));
if (loadDll == NULL)
{
QMessageBox::warning(this, QStringLiteral("警告!"), QStringLiteral("载入库文件失败!"), QMessageBox::Yes);
}
}
void Test00::on_startBtn_clicked()
{
FUNCTIONABZERO ABZERO = (FUNCTIONABZERO)GetProcAddress(loadDll,"ABZERO");
if (ABZERO==NULL)
{
QMessageBox::warning(this, QStringLiteral("警告!"), QStringLiteral("函数不存在!"), QMessageBox::Yes);
}
else
{
int a = ui.arg1->text().trimmed().toInt();
int result = ABZERO(a);
ui.result->setText(QString::number(result));
}
}
2、换用QLibrary
QLibrary myDLL("C:\VisualStudioWorkspace\QtStudy\Test00\Test00\TestDll.dll");
if (myDLL.load())
{
QMessageBox::information(this,"OK","DLL is loaded! ");
}
else
{
QMessageBox::warning(this,"Warning","DLL load failure!");
}
你期待的结果是什么?实际看到的错误信息又是什么?
希望大佬解惑!!!
- 共 0 条
- 全部回答
-
Pasttense 普通会员 1楼
在Qt程序中调用Fortran生成的DLL,主要涉及接口问题和编译器兼容性问题。以下是一种基本的步骤:
- 编写Fortran DLL:
在Fortran中创建一个子程序(或函数),并使用
BIND(C)属性使其符合C语言的调用规范,这样其他语言(如C++/Qt)可以正确调用。例如:
```fortran module mymod use, intrinsic :: ISO_C_BINDING
contains subroutine mysubroutine(a, b, c) bind(C) integer(c_int), intent(in) :: a real(c_double), intent(out) :: b character(kind=c_char), dimension(*) :: c
! ...你的Fortran代码...end subroutine mysubroutine end module mymod ```
- 编译Fortran为DLL: 使用相应的Fortran编译器(如Intel Fortran,GFortran等)编译上述Fortran代码为DLL。例如,在GFortran下,可能需要如下命令:
bash gfortran -shared -fPIC -o mydll.dll myfortranfile.f90- Qt中调用Fortran DLL: 在Qt中,你可以通过QLibrary加载DLL,并声明对应的函数指针类型来调用。
```cpp
include
typedef void (mysubroutine_type)(int, double, char*);
mysubroutine_type mysubroutine = nullptr; QLibrary lib("mydll.dll");
if (lib.load()) { mysubroutine = (mysubroutine_type) lib.resolve("mysubroutine_"); // 注意Fortran导出函数名可能带下划线后缀 if (mysubroutine) { int a = 10; double b; char c[256]; mysubroutine(a, &b, c); // ...处理返回结果... } else { qDebug() << "Failed to resolve function"; } } else { qDebug() << "Failed to load library"; } ``` 请注意,实际的函数名称可能会因为编译器的不同而有所变化(例如,GFortran会在函数名后添加下划线和额外的字符)。你可能需要查看编译生成的DLL的导出表以确定正确的函数名称。另外,确保Fortran编译器与Qt使用的C++编译器兼容,避免因ABI不匹配导致的问题。
- 编写Fortran DLL:
在Fortran中创建一个子程序(或函数),并使用
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
