Fortran Coder

查看: 44|回复: 2

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

[复制链接]

2

帖子

1

主题

0

精华

新人

F 币
17 元
贡献
7 点
发表于 2020-3-24 19:57:37 | 显示全部楼层 |阅读模式
本帖最后由 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               

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

回复

使用道具 举报

133

帖子

0

主题

0

精华

版主

World Analyser

F 币
244 元
贡献
256 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
发表于 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平台做相应调整。



2

帖子

1

主题

0

精华

新人

F 币
17 元
贡献
7 点
 楼主| 发表于 3 天前 | 显示全部楼层
问题已经解决,谢谢版主,不知道怎么结帖,谢谢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2020-4-4 23:18

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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