Fortran Coder

查看: 17863|回复: 14
打印 上一主题 下一主题

[混编] 新人求助,IVF怎么调用C++编好的dll文件?

[复制链接]

11

帖子

1

主题

0

精华

入门

F 币
118 元
贡献
44 点

规矩勋章

QQ
跳转到指定楼层
楼主
发表于 2015-2-5 00:11:59 来自移动端 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一次接触dll文件,里面放了一个函数,比如abc()。
用项目-添加现有文件 把这个dll文件添加好了以后,写了一个测试程序还是找不到这个函数abc。
使用的是call abc()语句,提示出错找不到abc函数,是不是我的测试主程序不能这样写?
同学用python与C++都能成功调出这个abc函数!但他对fortran不熟,请问论坛的各位大大,用ivf该如何调用该dll中的abc函数?如何操作,如何调用?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2015-2-5 08:49:59 | 只看该作者
1.通常 C++ 的 DLL 不容易调用。而 C 的 DLL 更容易一些。或者你的 C++ 使用 C 语言接口导出函数。
2.调用 DLL 有两种方式:隐式调用和显式调用。前者需要使用 LoadLibrary 和 GetProcAddress 两个函数找到 DLL 的函数入口。后者需要添加 lib 文件到工程中。

11

帖子

1

主题

0

精华

入门

F 币
118 元
贡献
44 点

规矩勋章

QQ
板凳
 楼主| 发表于 2015-2-5 09:53:48 | 只看该作者
vvt 发表于 2015-2-5 08:49
1.通常 C++ 的 DLL 不容易调用。而 C 的 DLL 更容易一些。或者你的 C++ 使用 C 语言接口导出函数。
2.调用  ...

谢谢您了,我去试试!

11

帖子

1

主题

0

精华

入门

F 币
118 元
贡献
44 点

规矩勋章

QQ
地板
 楼主| 发表于 2015-2-5 14:27:06 | 只看该作者
本帖最后由 yswwnmjk 于 2015-2-5 16:15 编辑
vvt 发表于 2015-2-5 08:49
1.通常 C++ 的 DLL 不容易调用。而 C 的 DLL 更容易一些。或者你的 C++ 使用 C 语言接口导出函数。
2.调用  ...

您好!这是我自己写的一个简单的dll文件
subroutine abc()
!DEC$ ATTRIBUTES DLLEXPORT :: SUB
  implicit none
  write(*,*) "Subroutine in DLL"
  return
end
然后把它编译为了dll文件
这是我的测试文件:
program UseTest
  implicit none
  call abc()
  Pause
end
在Project-添加现有项把dll文件添加到了目录下,但编译时IVF提示如下:
Error    1     error LNK2019: unresolved external symbol _ABC referenced in function _MAIN__    UseTest.obj   
Error    2     fatal error LNK1120: 1 unresolved externals    Debug\UseTest.exe   
而假如我把上面编译为lib,而不是编译成dll再添加,就可以正常通过了测试了。。。。
看了彭国伦的书,上面说的挺简单的。
谢谢您的指教!

abc.PNG (4.6 KB, 下载次数: 454)

abc.PNG

11

帖子

1

主题

0

精华

入门

F 币
118 元
贡献
44 点

规矩勋章

QQ
5#
 楼主| 发表于 2015-2-5 14:44:57 | 只看该作者
vvt 发表于 2015-2-5 08:49
1.通常 C++ 的 DLL 不容易调用。而 C 的 DLL 更容易一些。或者你的 C++ 使用 C 语言接口导出函数。
2.调用  ...

同时问下,怎么调用C++函数,有什么教程吗?
我有C++源代码,可是我不太懂C++。
并且已经用fortran写了许多代码了,现在需要调用下C++编写好的这个函数。
int srimp(double fo, double te, double tc, double fak, double dlon, double xkoh, double frei, double *mx)
这是C++我要调用的函数。
谢谢您!

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1370 元
贡献
581 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

6#
发表于 2015-2-5 15:42:12 | 只看该作者
! DEC$ ATTRIBUTES DLLEXPORT :: SUB

改为

! DEC$ ATTRIBUTES DLLEXPORT :: abc

由于混编与具体操作环境(编译器,IDE)等的关联性很大,不同的环境,具体操作就不同。所以没有统一的教材可供参考。

11

帖子

1

主题

0

精华

入门

F 币
118 元
贡献
44 点

规矩勋章

QQ
7#
 楼主| 发表于 2015-2-5 15:57:30 | 只看该作者
fcode 发表于 2015-2-5 15:42
! DEC$ ATTRIBUTES DLLEXPORT :: SUB

改为

谢谢,不过改了后还是报错,错误如以前还是一样的!

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1370 元
贡献
581 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

8#
发表于 2015-2-5 15:59:33 | 只看该作者
请把 DLL 编译后的 lib 文件添加到使用DLL的工程里。

11

帖子

1

主题

0

精华

入门

F 币
118 元
贡献
44 点

规矩勋章

QQ
9#
 楼主| 发表于 2015-2-5 16:07:39 | 只看该作者
本帖最后由 yswwnmjk 于 2015-2-5 16:08 编辑
fcode 发表于 2015-2-5 15:59
请把 DLL 编译后的 lib 文件添加到使用DLL的工程里。

好的,谢谢!

11

帖子

1

主题

0

精华

入门

F 币
118 元
贡献
44 点

规矩勋章

QQ
10#
 楼主| 发表于 2015-2-5 16:10:46 | 只看该作者
本帖最后由 yswwnmjk 于 2015-2-5 16:21 编辑
fcode 发表于 2015-2-5 15:59
请把 DLL 编译后的 lib 文件添加到使用DLL的工程里。

这样的确成功了,为什么不用lib不行呢?

同时把添加的dll删去,调试成功,但删除lib就提示调试出现错误。

同时我按照其它地方看到的调用dll文件的方法,刚刚还去修改了linker下的general与input选项。发现它出错提示又不一样了!

abcd.PNG (4.77 KB, 下载次数: 526)

abcd.PNG
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-15 02:52

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表