2016-12-19 1 views
1

그래서 Fortran과 C++ 코드를 연결하려고합니다. 실행 파일을 실행하려고 할 때 위의 오류가 발생합니다. 나는 다른 솔루션을 찾기 위해 어떤 노력을 해왔고 지금까지 찾은 것들 중 아무 것도 도움이되지 못했습니다. 나는 모든 것을 포함 시키려고 노력할 것이지만, 이런 종류의 물건으로는별로 좋지 않습니다. 그래서 저에게 알려주고 필요로하는 것이 있다면 그것을 알려주십시오.Symbol lookup error : _FileName_ : undefined symbol : _intel_fast_memmove

메이크 :

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 코드를 변경하지 않습니다. 난 그냥 내가 '모든 것을 포함했다고 생각, 도서관, CC는, 옵션, LKOPS, CMP, 지정된 메이크업 파일에서 COBJS 및 ../abXX에 대한 조리법

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

된다 INCLUDE의 정의를 제거 내가 비슷한 오류를 쳐다 보았던 다른 스레드에 대해 물어 보았는데, 유용 할 수있는 다른 것을 게시 할 수 있습니다.

편집 : 요청으로 : 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 

결과의`../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) 
+0

6 년 된 컴파일러에서 이미 쓸모 없었던 옵션을 사용하는 것 외에 CF 및 DF 라인에 오타가 있습니다. – tim18

+0

귀하의 게시물에 이름이나 감사를 표시하지 마십시오. 이름이 자동으로 추가되고 아이콘 오른쪽에 표시됩니다. –

답변

0

인텔 컴파일러가 설치 쉘 파일을 함께 ldd를. 배시에서는 ifortvars.shiccvars.sh이됩니다. 환경 설정 (여기서는 LD_LIBRARY_PATH)을 올바르게 설정하십시오.

ldd를 사용하여 생성 한 파일을 확인하십시오. 환경이 제대로 설정되어 있지 않으면 어떤 파일이 발견되지 않았는지 알려줄 것입니다.

+1

두 파일 모두 .mybashrc 파일에 추가했지만 실제 변경 사항이없는 것 같습니다. 나는 'source /opt/intel/bin/compilervars.sh intel64' 이 이미이 작업을 수행하고 있다고 생각합니다. ldd로 실행 파일을 검사 할 때 모든 인쇄 라이브러리가 정의 된 경로를 가리키는 것처럼 보입니다. –

+0

링 단계가 완료되었는지 여부를 결정하는 데 여전히 문제가있는 경우 철자를 수정하더라도 (잘못 인용하지 않은 경우) #를 추가하여 링커 스크립트의 구조를 반향시킬 수 있습니다.ldd는 링크를 완료했지만 런타임에 올바른 LD_LIBRARY_PATH를 갖고 있지 않은 경우 더 잘 작동합니다. – tim18

+0

안녕하세요, 죄송합니다. compilervars.sh 소싱을 놓쳤습니다. 다른 모든 수출품을 제거하고 다시 시도 할 수 있습니까? (모든 '* .o', '* .so'및 '* .mod'파일 정리 후). 그런 다음 프로그램을 만들고 여기에'ldd abXX'와'echo $ LD_LIBRARY_PATH'의 내용을 복사하여 붙여 넣으십시오. –

관련 문제