Fortran Coder

标题: 新人求助,IVF怎么调用C++编好的dll文件? [打印本页]

作者: yswwnmjk    时间: 2015-2-5 00:11
标题: 新人求助,IVF怎么调用C++编好的dll文件?
第一次接触dll文件,里面放了一个函数,比如abc()。
用项目-添加现有文件 把这个dll文件添加好了以后,写了一个测试程序还是找不到这个函数abc。
使用的是call abc()语句,提示出错找不到abc函数,是不是我的测试主程序不能这样写?
同学用python与C++都能成功调出这个abc函数!但他对fortran不熟,请问论坛的各位大大,用ivf该如何调用该dll中的abc函数?如何操作,如何调用?
作者: vvt    时间: 2015-2-5 08:49
1.通常 C++ 的 DLL 不容易调用。而 C 的 DLL 更容易一些。或者你的 C++ 使用 C 语言接口导出函数。
2.调用 DLL 有两种方式:隐式调用和显式调用。前者需要使用 LoadLibrary 和 GetProcAddress 两个函数找到 DLL 的函数入口。后者需要添加 lib 文件到工程中。
作者: yswwnmjk    时间: 2015-2-5 09:53
vvt 发表于 2015-2-5 08:49
1.通常 C++ 的 DLL 不容易调用。而 C 的 DLL 更容易一些。或者你的 C++ 使用 C 语言接口导出函数。
2.调用  ...

谢谢您了,我去试试!
作者: yswwnmjk    时间: 2015-2-5 14:27
本帖最后由 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, 下载次数: 515)

abc.PNG

作者: yswwnmjk    时间: 2015-2-5 14:44
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++我要调用的函数。
谢谢您!
作者: fcode    时间: 2015-2-5 15:42
! DEC$ ATTRIBUTES DLLEXPORT :: SUB

改为

! DEC$ ATTRIBUTES DLLEXPORT :: abc

由于混编与具体操作环境(编译器,IDE)等的关联性很大,不同的环境,具体操作就不同。所以没有统一的教材可供参考。
作者: yswwnmjk    时间: 2015-2-5 15:57
fcode 发表于 2015-2-5 15:42
! DEC$ ATTRIBUTES DLLEXPORT :: SUB

改为

谢谢,不过改了后还是报错,错误如以前还是一样的!
作者: fcode    时间: 2015-2-5 15:59
请把 DLL 编译后的 lib 文件添加到使用DLL的工程里。
作者: yswwnmjk    时间: 2015-2-5 16:07
本帖最后由 yswwnmjk 于 2015-2-5 16:08 编辑
fcode 发表于 2015-2-5 15:59
请把 DLL 编译后的 lib 文件添加到使用DLL的工程里。

好的,谢谢!
作者: yswwnmjk    时间: 2015-2-5 16:10
本帖最后由 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, 下载次数: 598)

abcd.PNG

作者: pasuka    时间: 2015-2-5 16:27
paralution_solver.f90 (5.53 KB, 下载次数: 3)
mmio.f (28.56 KB, 下载次数: 3)

上传了paralution的fortran接口程序和示例,会C或C++的话,琢磨半天肯定能够看明白的。
一般做法就是在c++代码里面用extern定义C函数,然后fortran利用iso c binding写interface并调用

paralution_fortran.zip

3.65 KB, 下载次数: 5


作者: yswwnmjk    时间: 2015-2-5 16:59
pasuka 发表于 2015-2-5 16:27
上传了paralution的fortran接口程序和示例,会C或C++的话,琢磨半天肯定能够看明白的。
一般做法 ...

谢谢,不过不知道为什么附件无法读取?
作者: yswwnmjk    时间: 2015-2-5 18:36
fcode 发表于 2015-2-5 15:59
请把 DLL 编译后的 lib 文件添加到使用DLL的工程里。

抱歉,刚刚发现原来fortran编出的dll文件还需要lib的支持,两个单独用都不行,单独用lib虽然能够build,但不可以debug。谢谢您了!
作者: pasuka    时间: 2015-2-5 23:05
本帖最后由 pasuka 于 2015-2-5 23:10 编辑
yswwnmjk 发表于 2015-2-5 16:59
谢谢,不过不知道为什么附件无法读取?
好像附件区不能下载,lz可以去软件主页下载源代码http://www.paralution.com/download/

mmio.f

28.56 KB, 下载次数: 1

paralution_solver.f90

5.53 KB, 下载次数: 1

paralution_fortran.zip

3.7 KB, 下载次数: 1


作者: fcode    时间: 2015-2-6 10:47
已修复附件引起的问题。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2