zhaoxubao7005 发表于 2020-3-24 19:57:37

vs2015 intel fortran x64 调用动态链接库出错,请帮忙解决一下

本帖最后由 kyra 于 2020-3-25 09:05 编辑

各位老师好:我现在有个问题想请教大家,谢谢:
我现在想在vs2015下用x64平台intel fortran进行动态链接库dll中的函数进行调用(c++生产)。
动态链接库函数也是在vs2015平台下,用x64 debug环境下生产。具体代码如下:
lib.cpp代码如下
#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代码如下
#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 代码如下
LIBRARY "dlltt"
EXPORTS
abc @ 1
getstr @ 2
编译链接后,生产动态链接库。拷贝到intel fortran的工程下。

然后在vs2015 x64 debug环境下用intel fortran 调用abc() 和 getStr() 函数。
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:08

本帖最后由 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:48

问题已经解决,谢谢版主,不知道怎么结帖,谢谢

yusiling 发表于 2021-8-16 09:52:26

你好,请问是怎么解决的呢?是哪里出了问题?
页: [1]
查看完整版本: vs2015 intel fortran x64 调用动态链接库出错,请帮忙解决一下