【问题标题】:Symbol lookup error: _FileName_: undefined symbol: _intel_fast_memmove符号查找错误:_FileName_:未定义符号:_intel_fast_memmove
【发布时间】:2017-05-04 18:48:19
【问题描述】:

所以我正在努力将 Fortran 和 C++ 代码链接在一起,当我尝试运行可执行文件时出现上述错误。我已经搜索了其他解决方案,但到目前为止我发现的所有东西都没有帮助。我会尝试包含所有内容,但我对这种东西不是很好,所以如果还有其他需要/有用的东西让我知道,我会去抓住它。

生成文件:

LDLIBS = -I/share/apps/intel/composer_xe_2011.sp1.10.319/mkl/include \
         -L/share/apps/intel/composer_xe_2011_sp1.10.319/mkl/lib/intel64 \
         -I/share/apps/intel/composer_xe_2011_sp1.10.319/mkl/interfaces/lapack95/source\
         -mkl -openmp -reentrancy threaded

INCLUDE = -I/path/mstl/include \
          -I/path/mstl/include/physics \
          -I/path/mstl/include/math2 \
          -I/path/mstl/include/math2/algebra \
          -I/path/mstl/include/mat2/analysis \
          -I/path/mstl/include/math2/data \
          -I/path/mstl/include/math2/geometry \
          -I/path/mstl/include/math2/group \
          -I/path/mstl/include/math2/spline \
          -I/path/mstl/include/math2/probabilityandstatistics

LIBRARY = -L/path/mstl/lib

FC = ifort -c             #f compiler
CC = icc -c               #c compiler
LK = ifort -v -o ../abXX  #linker

CF = -mcmodel=large -i-dynamic -no-ipo -r8 -xW -traceback -fpe0 #f compile flags
OF = $(CF) -O2                                                  #f optimization flags
DF = $(CF) -g -debug -fpskchk -C -warn interfaces               #f debug flags

OPTIONS = -O -loops -lstdc++ -lmstl.icc          #c compile flags
LKOPS = -icc -lstdc++ -lmstl.icc -cxxlib -lintlc #linking options for C libs

COMP = $(FC) $(OF)                               #fortran compiler
CMP = $(CC) $(LIBRARY) $(INCLUDE) $(OPTIONS)     #C++ compiler
LINK = $(LK) $(OF)                               #program linker

MODULES = list of all fortran .o files here. 

COBJS = list of all c++ .o files here.

.cpp.o:
       $(CMP) $<

.f.o:
       $(COMP) $<

../abXX: $(MODULES) $(COBJS)
        $(LINK) $(MODULES) $(COBJS) $(LDLIBS) $(LIBRARY) $(INCLUDE) $(LKOPS)

clean:
      rm -v -f *.o *.mod ../abXX

.mybashrc:

echo "I exist in mybashrc"

export PATH=$PATH:/opt/intel/composer_xe_2011_sp1/bin
export PATH=$PATH:/opt/INTEL/bin

source /opt/INTEL/bin/compilervars.sh intel64
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/opt/intel/composerxe/mkl/lib/intel64/
export LD_LIBRARY_PATH = /opt/intel/composer_xe_2011_sp1.10.319/compiler/lib/intel64/:$LD_LIB_PATH

export INTEL_LICENSE_FILE = /opt/INTEL/licenses/client.lic

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/mkl/lib/intel64

错误信息:

./../abXX: symbol lookup error: ./../abXX: undefined symbol: _intel_fast_memmove

我还运行了以下小脚本来查找其他未定义的符号:

nm --line-numbers --print-file-name --undefined-only --no-sort *.o > errorlist.txt
grep _intel_fast_ errorlist.txt > intelerrors.txt

当我这样做时,我实际上发现 Fortran 文件中有大量未定义的对 _intel_fast_memcpy 和 _intel_fast_memset 的引用。 _intel_fast_memmove 仅在其中一个 cpp 文件中显示为缺失。

我也觉得这很奇怪,因为没有 c 的 Fortran 代码运行得很好。我没有对 Fortran 代码进行任何更改。我只是从指定的 make 文件中删除了 INCLUDE、LIBRARY、CC、OPTIONS、LKOPS、CMP 和 COBJS 的定义,../abXX 的配方变成了

$(LINK) $(MODULES) $(LDLIBS)

我想我已经将我所看到的所有内容都包含在我看过的其他线程中,并出现了类似的错误,我也可以发布任何其他可能有用的内容。

编辑:根据要求:

echo $LD_LIBRARY_PATH的结果:

/opt/intel/composer_xe_2011_sp1.10.319/compiler/lib/intel64/:/opt/INTEL/compilers_and_libraries_2016.3.210/linux/compiler/lib/intel64:/opt/INTEL/compilers_and_libraries_2016.3.210/linux/compiler/lib/intel64_lin:/opt/INTEL/compilers_and_libraries_2016.3.210/linux/ipp/lib/intel64:/opt/INTEL/compilers_and_libraries_2016.3.210/linux/compiler/lib/intel64:/opt/INTEL/compilers_and_libraries_2016.3.210/linux/mkl/lib/intel64:/opt/INTEL/compilers_and_libraries_2016.3.210/linux/tbb/lib/intel64/gcc4.4:/opt/INTEL/debugger_2016/libipt/intel64/lib:/opt/INTEL/compilers_and_libraries_2016.3.210/linux/daal/lib/intel64_lin:/opt/INTEL/compilers_and_libraries_2016.3.210/linux/daal/../tbb/lib/intel64_lin/gcc4.4:/opt/INTEL/compilers_and_libraries_2016.3.210/linux/daal/../compiler/lib/intel64_lin::/opt/intel/composerxe/mkl/lib/intel64/:/opt/intel/composerxe/mkl/lib/intel64/:/opt/intel/mkl/lib/intel64

`ldd ../abXX' 的结果

linux-vdso.so.1 =>  (0x00007fffb51b8000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003171800000)
libintlc.so.5 => /opt/intel/composer_xe_2011_sp1.10.319/compiler/lib/intel64/libintlc.so.5 (0x00007fc93b678000)
libmkl_intel_lp64.so => /opt/INTEL/compilers_and_libraries_2016.3.210/linux/mkl/lib/intel64/libmkl_intel_lp64.so (0x00007fc93ab68000)
libmkl_intel_thread.so => /opt/INTEL/compilers_and_libraries_2016.3.210/linux/mkl/lib/intel64/libmkl_intel_thread.so (0x00007fc939238000)
libmkl_core.so => /opt/INTEL/compilers_and_libraries_2016.3.210/linux/mkl/lib/intel64/libmkl_core.so (0x00007fc937820000)
libiomp5.so => /opt/intel/composer_xe_2011_sp1.10.319/compiler/lib/intel64/libiomp5.so (0x00007fc937528000)
libifport.so.5 => /opt/intel/composer_xe_2011_sp1.10.319/compiler/lib/intel64/libifport.so.5 (0x00007fc9373f0000)
libifcoremt.so.5 => /opt/intel/composer_xe_2011_sp1.10.319/compiler/lib/intel64/libifcoremt.so.5 (0x00007fc937178000)
libimf.so => /opt/intel/composer_xe_2011_sp1.10.319/compiler/lib/intel64/libimf.so (0x00007fc936da8000)
libsvml.so => /opt/intel/composer_xe_2011_sp1.10.319/compiler/lib/intel64/libsvml.so (0x00007fc936628000)
libm.so.6 => /lib64/libm.so.6 (0x000000316b000000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003171400000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x000000316b400000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000316b800000)
libc.so.6 => /lib64/libc.so.6 (0x000000316ac00000)
/lib64/ld-linux-x86-64.so.2 (0x000000316a800000)

【问题讨论】:

  • 您在 CF 和 DF 行中有拼写错误,此外还使用了在那个 6 年前的编译器中已经过时的选项。
  • 不要把你的名字或感谢放在你的帖子下面。您的姓名会自动附加并显示在您图标的右侧。

标签: c++ fortran linker-errors


【解决方案1】:

英特尔编译器附带一个设置 shell 文件。对于 bash,它们将是 ifortvars.shiccvars.sh。找到正确设置环境(此处为 LD_LIBRARY_PATH)的源。

检查您使用 ldd 生成的文件。如果您的环境设置不正确,它会告诉您找不到哪些.so 文件。

【讨论】:

  • 我将这两个都添加到了 .mybashrc 文件中,但它似乎没有真正的变化。我认为source /opt/intel/bin/compilervars.sh intel64 已经在这样做了。当我使用 ldd 检查可执行文件时,看起来所有打印的库都指向定义的路径。
  • 如果您仍然无法确定链接阶段是否完成,尽管更正了您的拼写(如果您没有错误引用它们),您可以添加 -# 以呼应链接器脚本。如果您完成了链接但在运行时没有正确的 LD_LIBRARY_PATH,则 ldd 更有可能工作。
  • 嗨,对不起,我错过了 compilervars.sh 的采购。您可以删除所有其他导出并重试吗? (在清理所有 '.o'、'.so' 和 '*.mod' 文件后)。然后,制作程序并在此处复制粘贴ldd abXXecho $LD_LIBRARY_PATH的输出
  • 所以我删除了两个source 命令,但.mybashrc 中的其余导出命令要么让此代码编译,要么我运行的其他代码之一,所以我没有删除那些。最后 .mybashrc 文件看起来就像在原始帖子中一样。 ldd abXXecho $LD_LIBRARY_PATH 的输出太长,无法发表评论,所以我编辑了上面的帖子以包含它们的输出。
  • 您是否安装了多个英特尔编译器?
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
相关资源
最近更新 更多