回 帖 发 新 帖 刷新版面

主题:【求助】给Fortran安装FFTW库出现的ERROR link 2001

这是我的第一篇帖子。长期关注 编程者爱好论坛很久,尤其是FORTRAN板块,受益匪浅。在此先拜谢各位前辈。

近几天,安装快速傅里叶变换库 FFTW,不知道问题出在哪里。困惑了很久。问题如下:

    同样的步骤、方法,安装给C/C++调用,一点问题都没有,换到给FORTRAN就无论如何不行了....


    使用编译环境为 Microsoft Visual C++ 6.0,同时安装了Compaq Visual fortran Pprfession 6.6版本,二者自然融为一体

而后按照安装 DLL文件的惯例,
①将libfftw3f-3.dll libfftw3-3.dll libfftw3l-3.dll放入windows/system32中 

②把对应DLL文件的LIB文件libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib和有关的需要include的文件,分别放到相应的目录文件下,这是通 过 tools》options 》directories 下的show directories for 添加相应的lib文件和include文件的

③ 然后就是建工程的时候,project 》 settings 》link下的 object /library modules 下,不忘记添加 libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib的字样

   照此,应该是没问题的,在C++下,测试了一段代码,compile 、link都没有错误,圆满地可以使用

  然而,照此同样办法操作,Compaq Visual fortran Pprfession 6.6硬是不认,其中build 时候没有错误,可是link时候就出现错误了:

        error LNK2001: unresolved external symbol _DFFTW_PLAN_DFT_R2C_2D
        error LNK2001: unresolved external symbol _DFFTW_EXECUTE

其中DFFTW_PLAN_DFT_R2C_2D和DFFTW_EXECUTE是相应的FFTWl里面的函数

  求教:会是什么问题?到底为什么?

        顺便提及一下,在visual studio 2008下,也有类似的问题,C/C++什么事都没有,顺利使用,一用到集成到visual studio 2008下的 intel visual fortran,就挂了,本质上完全和上述一样的毛病。

     多谢各位~~~!!恳请过来人指点。拜谢

回复列表 (共7个回复)

沙发

如果是ivf,则可以用bind(c,name="xxxxx")来解决。
如果是CVF,则需要使用宏来做别名:)
因为FORTRAN中如果没有做别名则认为函数名是大写的(但fftw里好像都是小写的)

板凳

虽然问题没有解决(小生愚钝),但是又学到了一点有用的东西。

    我确认我安装dll以及其他相应相应步骤没有错(如原帖所述),按照相应步骤安装并调用fortran的动态链接库一点没有问题。
    fftw作为一个C subroutine library ,是不是因为它是用C语言生成的相应 dll 文件,所以对C就比较友好,而如果是Fortran等其他语言,就不能直接安装后调用???

    可是按照FFTW的Manual,调用语句是没有错误的,Manual也没有提及要用bind(c,name="xxxxx")来解决或宏来解决、
    
   怎么办?如方便,恳请进一步指教。谢谢~~


3 楼

Er,我在FTP联盟上的提示你没看懂么?
如果不用F2003,移植跨编译器将无可保证,本来就是大小写的问题
那么可以用一个中间层来解决嘛,这不是很正常的思路么

CVF生成的是大写是吧
那你用C写个中间层啊,写个大写啊,把这个大写重定向到小写就是了
比如
void AAA()
{
   aaa();
}
这是最简单最容易想到而且对编译器无限制的方法思路

当然有在def里重定向来重新生成导入库的高级方法(MPICH2/Firefox某些组件就是这样做的)
我为什么说这样的问题都不愿意回答,是因为需要的背景知识太多,讲一周都说不完

对生成符号全名有疑问的,使用dumpbin -symbols之类查看,以防有链接错误

4 楼

首先,非常感谢你的几次帮助,多谢~~同为一个学院,差别实在太大。钱到月底不够花,书到用时方恨少。。
  我马上试一试你说的
void AAA()
{
   aaa();
}
这一方法,可能正是症结所在.[b]不过,然后这样,就可以在FORTRAN里面调用了?[/b]

你的指点我让我想到了 “在FORTRAN 中调用 C语言”,因为如前所述,现在我装在C/C++环境下调用没问题,同样步骤装在FORTRAN下就挂了...用那种比较简单的,我会[b]。(可能我完全曲解了你的意思,抱歉。。。难者不会,会者不难)[/b]。我的Vc++6.0 和 VF 6.6集成到一起了,应该可以用,以前用过那种比较简单的。。深层次的不会。。。

感觉你知道的很多,拜谢~

顺便能指点几个问题吗?莫见笑,可能很小白。。。。

① 是不是C语言中生成的 dll在C语言中应用就基本可以直接用,而别的语言(例如FORTRAN)要想用C语言生成的 dll,就没那么直接?要是这个FFTW是用FORTRAN而非C编写的就好了,或者我现在的代码全是C、C++的。。。

② 是不是“一般某种语言的 dll,可以被其他很多语言直接使用,也就是用 DLL 的时候,与它原本是哪种语言的 DLL 没有关系” 的说法是不对的?我觉得是,但是不敢确认。。。

  被这个快速傅里叶变换库 fftW在 fortran 下的安装及使用,整够了。。。。

  

5 楼

混合编程除了注意编译符号的问题,还有调用约定和参数的事情
后两者可以编译链接完成(调用约定会可能会有警告),但是会运行操作非法,所以还是先解决编译符号的事情吧

直接不直接看你怎么弄了,自己造导入库就直接,原生的就不直接(就是我说的自己造DEF重定向)

只要是dll(非托管的),接口又知道(不知道就要逆向),那么无论谁调用都可以使用(只讨论编译型语言)

6 楼

还有记得stdcall和cdecl的问题,崩溃往往源于此处:)

7 楼


多谢以上各位~
限于个人水平和理解能力,以及当前时间紧的现实,虽然没能通过以上各位指点的方法解决解决问题(已转投出发点就完全不同的其他办法并解决了),但依然收获不少。
 

我来回复

您尚未登录,请登录后再回复。点此登录或注册