链接预编译模块时未解析的外部符号

时间:2015-09-21 10:41:37

标签: fortran

我正在尝试使用外部预编译模块编译Fortran文件。 首先,我用:

编译模块文件
ifort /c KDTree_mod.f90

它会生成一些.mod文件(kdtree2_module.mod,kdtree2_precision_module.mod,kdtree2_priority_queue_module.mod)。

在子程序的开头,我有:

subroutine film(h,tinf,ts,n,time)
use kdtree2_module

但是当我启动程序时,它给了我这个错误:

user_film.obj : error LNK2019: unresolved external symbol KDTREE2_MODULE_mp_KDTREE2_CREATE referenced in function FILM
user_film.obj : error LNK2019: unresolved external symbol KDTREE2_MODULE_mp_KDTREE2_N_NEAREST referenced in function FILM
user_film.exe : fatal error LNK1120: 2 unresolved externals
link failed for user_film.obj

步骤:
1.使用ifort /c KDTree_mod.f90编译模块 2.使用用户子程序电影启动MSC Marc      run_marc -j name_input_file -u user_subroutine
3.错误

MSC Marc是一种可以创建用户子程序的商业软件。

更新
我试过了:
1. ifort /c KDTree_mod.f90 - >生成.obj文件
   run_marc -j name_input_file -obj name_obj.obj -u name_input_file
   编译好但突然错误:

  

forrtl:severe(170):程序异常 - 堆栈溢出图像
  PC常规线源

     

user_film.exe 0000000141D63717未知未知   未知user_film.exe 000000013FD45C96未知
  未知未知user_film.exe 000000013FF1CCC7未知
  未知未知user_film.exe 000000013FD9495E未知
  未知未知user_film.exe 00000001405A819A未知
  未知未知user_film.exe 0000000140236B11未知
  未知未知user_film.exe 000000013FFE32DB未知
  未知未知user_film.exe 000000013FFEE6C1未知
  未知未知user_film.exe 000000013FE70FAE未知
  未知未知user_film.exe 000000013FD51592未知
  未知未知user_film.exe 000000013FD4105D未知
  未知未知user_film.exe 00000001424CE3DC未知
  未知未知user_film.exe 0000000141D638B2未知
  未知未知kernel32.dll 0000000077475A4D未知
  未知未知ntdll.dll 00000000775AB831未知
  未知未知

  1. ifort /c KDTree_mod.f90 ifort /c user_film.f run_marc -j name_input_file -obj KDtree_mod.obj user_film.obj
    read error: no such option: user_film.obj or input value: -b

    所以似乎我无法传递两个.obj文件。

  2. ifort /c KDTree_mod.f90 ifort /c user_film.f KDTree_mod.obj ifort: warning #10146: no action performed for specified object file(s)

  3. Marc in verbose:http://pastebin.com/6rd8v5Eh

    更新2 我可以用这些命令编译一个dll文件:

    ifort /nologo /iface:stdcall /libs:dll /threads /c KDTree_mod.f90
    link /NOLOGO /SUBSYSTEM:WINDOWS /manifest /dll /out:KDTree_mod.dll KDTree_mod.obj
    mt /nologo “/outputresource:KDTree_mod.dll;#2″ /manifest KDTree_mod.dll.manifest
    

1 个答案:

答案 0 :(得分:0)

我在互联网上找到的最有用的信息是german CAD forum,其中有一个run_marc,其中包含以下内容:

FCOMP=ifort
...
FORTRAN="$FCOMP -c -assume byterecl -safe_cray_ptr $PROFILE -save -zero -mp -WB -w90 -O1 $I8FFLAGS -I$MARC_SOURCE/common \
-I$MARC_SOURCE/bcssolver/common -I$MARC_SOURCE/mumpssolver/include $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS"

您需要在此命令行中添加-obj KDTree_mod.obj等。从描述中可以看出它也可以链接到库,因此创建库并通过更符合该工具的一般用法的路径使用它可能是另一种选择。

关于您的第一次更新:我根本不希望-obj选项适用于此。我的意思是,您需要修改run_marc脚本本身。根据上面的链接,它似乎是一个包含变量的脚本,其中包含运行脚本。可能这只是Unix系统上的情况,而在Windows上它的解决方式不同。您是否尝试查看run_marc脚本?我不知道你的更新中你的第一个命令是什么,你说要编译,实际上突然之间就是这个name_obj?

在你的第二个命令中,我会期待类似的东西:

run_marc -j name_input_file -u user_film -obj KDtree_mod.obj

尽管如上所述,我认为obj不会被传递。

关于您的第二次更新,以及您的评论如下:

除了链接之外,您还需要在包含路径中提供模块文件。通常编译器的include路径包含当前工作目录,因此如果您可以将模块文件放入执行编译器的目录中,这应该可以工作。或者您将其放在通过上面编译-I命令中的FORTRAN选项所述的其中一个目录中。或者,您修改命令并添加自己的包含路径。

如果填充了set userdll选项,那么来自您的pastebin的命令如何:

ifort  /fpp /c /DWIN32_intel  -D_IMPLICITNONE /nologo
      -DMKL -DOPENMP -DOMP_COMPAT -D_MSCMARC -DWIN64
      /I"C:\MSC.Software\Marc\2014.0.0\marc2014\common"
      /I"C:\MSC.Software\Marc\2014.0.0\marc2014\bcsgpusolver\common" 
      /I"C:\MSC.Software\Marc\2014.0.0\marc2014\mumpssolver\include" 
      /I"C:\MSC.Software\Marc\2014.0.0\marc2014\intelmpi\win64\include"
      /O2 /Qip /Qvec- /Qsafe-cray-ptr /switch:fe_old_modvar
      /W0  /Qopenmp /Qopenmp-threadprivate:compat  -DCASI -DPARDISO -DMUMPS
      -DBCSGPU -DCUDA /MD -DDDM
      /object:"C:\Users\Yellowhat\Desktop\prova\user_film.obj"
      "C:\Users\Yellowhat\Desktop\prova\user_film.f"

看起来C:\MSC.Software\Marc\2014.0.0\marc2014\common是放置KDTree *.mod文件的好位置。