Fortran Coder

标题: vs2015 intel fortran x64 调用动态链接库出错,请帮忙解决一下 [打印本页]

作者: zhaoxubao7005    时间: 2020-3-24 19:57
标题: vs2015 intel fortran x64 调用动态链接库出错,请帮忙解决一下
本帖最后由 kyra 于 2020-3-25 09:05 编辑

各位老师好:我现在有个问题想请教大家,谢谢:
我现在想在vs2015下用x64平台intel fortran进行动态链接库dll中的函数进行调用(c++生产)。
动态链接库函数也是在vs2015平台下,用x64 debug环境下生产。具体代码如下:
lib.cpp代码如下
[C] 纯文本查看 复制代码
#include <Windows.h>
#include <stdio.h>

#include <intrin.h>        // 所有Intrinsics函数
extern "C" void _cdecl abc(int *a)
{
        *a = *a+2;
}

extern "C" void _cdecl getstr(char *st)
{
        sprintf_s(st, 10, "%8s", "abc");
        //strCPUId += buf;  _cdecl
        //st = "abc";
}

lib.h代码如下
[C] 纯文本查看 复制代码
#pragma once
#ifndef LIB_H
#define LIB_H

extern "C" void _cdecl abc(int *a);
extern "C" void _cdecl getstr(char *st);
#endif

lib.def 代码如下
[C] 纯文本查看 复制代码
LIBRARY "dlltt"
EXPORTS
abc @ 1
getstr @ 2

编译链接后,生产动态链接库。拷贝到intel fortran的工程下。

然后在vs2015 x64 debug环境下用intel fortran 调用abc() 和 getStr() 函数。
fortran 代码如下:
[Fortran] 纯文本查看 复制代码
!****************************************************************************
!
!  PROGRAM: Console1test
!
!  PURPOSE:  Entry point for the console application.
!
!****************************************************************************
module computer
     interface
!---------------------------------------------
    subroutine abc(scput)
    !!   use iso_c_binding
      !DEC$ATTRIBUTES C,ALIAS:'_abc'::ABC

      !DEC$ATTRIBUTES reference::scput
       integer scput
    end subroutine
!!    subroutine getstr(strr)
!!    use iso_c_binding
!!      !DEC$ATTRIBUTES C,ALIAS:'_getstr'::GETSTR
!!      !DEC$ATTRIBUTES reference::strr
!!      character strr(50)
!!    end subroutine
!-----------------------------------------------
end interface
end module
    program Console1test
    use computer
   
   ! use, intrinsic :: iso_c_binding
   
    ! Variables
    character sss(50)
    integer :: ii=5
    ! Body of Console1test
    !call getstr(str)
    call abc(ii)
      write(*,*) ii
  !!    call getstr(sss)
  !!    write(*,*) sss
      
    print *, 'Hello World'

    end program Console1test

以上的程序代码在vs2015 x86 debug下没有问题,我试验过。就是在x64位下出现找不到abc() 等函数的错误;不知道什么原因。
错误如下:

严重性        代码        说明        项目        文件        行        禁止显示状态
错误                error LNK2019: 无法解析的外部符号 _abc,该符号在函数 MAIN__ 中被引用                Console1test.obj               

请大家帮忙解决一下。谢谢!


作者: kyra    时间: 2020-3-25 09:07
本帖最后由 kyra 于 2020-3-25 09:08 编辑

请用 ISO_C_Binding 而不要用
!DEC$ATTRIBUTES C,ALIAS:'_abc'::ABC


integer , value :: scput
而不要用
!DEC$ATTRIBUTES reference::scput
尽可能的不要用 !DEC$ 这种扩展写法。因为他不一定适合x64平台,或者要根据x64平台做相应调整。




作者: zhaoxubao7005    时间: 2020-4-1 18:16
问题已经解决,谢谢版主,不知道怎么结帖,谢谢
作者: yusiling    时间: 2021-8-16 09:52
你好,请问是怎么解决的呢?是哪里出了问题?




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