2017-03-21 8 views
0

SCons 링커 인수, 옵션 및 플래그를 원하는 순서로 사용하게하려면 어떻게해야합니까?SCons에 대한 전체 링크 줄 지정

더 구체적으로 말하자면, Linux에서 GNU gfortran 컴파일러를 사용하는 Fortran 소스 코드와 Intel Math Kernel Library에서 프로그램을 빌드하려고합니다. 인텔의 링크 라인 고문에서, 나는 내 링커 명령에 다음 세그먼트를 추가해야한다고 알고

${F95ROOT}/lib/intel64/libmkl_lapack95_lp64.a -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl 

는 어디에 나 또한 내 환경에 대한 $F95ROOT$MKLROOT을 알고있다. 사실, 내가 할 경우

gfortran -o prog file1.o file2.o ${F95ROOT}/lib/intel64/libmkl_lapack95_lp64.a -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl 

내가 실행 파일 prog을 생성 할 수 있습니다 좋아한다. 내가 수 있도록 노력 경우, SCons는 다음 SCons는 다음 명령이 실행

mklroot='/opt/intel/compilers_and_libraries_2017.2.174/linux/mkl' 
f95root='/home/norio/opt/intel/mkl2017_interfaces_gfortran484' 

env['LIBS']=[f95root+'/lib/intel64/libmkl_lapack95_lp64.a', 
     'mkl_gf_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread', 'm', 'dl'] 
env['LIBPATH']=[mklroot+'/lib/intel64'] 
env['LINKFLAGS'] = ['-Wl,--no-as-needed'] 

SConstruct 파일을 작성하여 같은 일을 :

이 다음과 같은 오류가 발생
gfortran -o prog -Wl,--no-as-needed file1.o file2.o -L/opt/intel/compilers_and_libraries_2017.2.174/linux/mkl/lib/intel64 -l/home/norio/opt/intel/mkl2017_interfaces_gfortran484/lib/intel64/libmkl_lapack95_lp64 -lmkl_gf_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl 

:

/usr/bin/ld: cannot find -l/home/norio/opt/intel/mkl2017_interfaces_gfortran484/lib/intel64/libmkl_lapack95_lp64 

SCons가 에 지정된 정적 라이브러리 f95root+'/lib/intel64/libmkl_lapack95_lp64.a'을 공유 라이브러리로 간주하고 링커가 해당 라이브러리를 찾지 못했습니다. 공유 라이브러리. 이 특별한 경우에 빌드에 정적 라이브러리를 지정하는 방법을 알고 있다면 충분할 수 있습니다. 그렇게하는 법을 나에게 말할 수 있다면, 나는 또한 매우 기뻐할 것이다. 그럼에도 불구하고 때때로 링커 옵션, 플래그 및 인수의 순서가 중요 할 수 있다고 생각합니다. SCons를 사용하는 경우 링커 옵션, 플래그 및 인수의 순서가 중요 할 수 있으며 해당 순서에 대한 제어가 필요한 경우에 관심이 있습니다. 수요일 3월 22일 인도 표준시 00시 53분 34초 2017


편집은 내가 대신 다른 소스 파일과 함께 Program() 명령의 source 인수에 추가하여 정적 라이브러리를 지정할 수 있다는 것을 발견 env [ 'LIBS']에 그것을 나열하십시오. 그래서, 다음과 같은 것을 실행 파일을 빌드 할 수 있습니다.

mklroot='/opt/intel/compilers_and_libraries_2017.2.174/linux/mkl' 
f95root='/home/norio/opt/intel/mkl2017_interfaces_gfortran484' 
stat_lib_list=[f95root+'/lib/intel64/libmkl_lapack95_lp64.a'] 

env['LIBS']=['mkl_gf_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread', 'm', 'dl'] 
env['LIBPATH']=[mklroot+'/lib/intel64'] 
env['LINKFLAGS'] = ['-Wl,--no-as-needed'] 

.. 

env.Program(target='prog', source=['file1.f90','file2.f90']+stat_lib_list) 

나는 아직도 내가 전체 링커 라인의 완벽하게 제어 할 수있는 방법을 모르거나 SCons는 정말 똑똑 경우 옵션, 플래그의 순서를 알아낼 수 및 인수 항상 성공적하기 .

+0

나는 태그를 가진 정말 가치라고 생각합니다. 리눅스 대신 gfortran을 사용했는지 아니면 대신 다른 리눅스를 사용할지 결정하십시오. Scons는 개별 컴파일러를 신경 쓰지 않습니다. –

+0

O.K. 고맙습니다. 괜찮아. 나는 fortran 또는 gfortran 태그 중 어느 것을 넣어야할지 궁금해했다. 둘 다 가지고있는 것이 좋다. – norio

+0

문제의 라이브러리 위치에 LIBPATH를 사용하지 않는 이유는 무엇입니까? (libmkl_lapack95_lp64.a) – bdbaddog

답변

1

이 기능이 작동합니까?

mklroot='/opt/intel/compilers_and_libraries_2017.2.174/linux/mkl' 
f95root='/home/norio/opt/intel/mkl2017_interfaces_gfortran484' 
env['LIBS']=['mkl_lapack95_lp64', 
    'mkl_gf_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread', 'm', 'dl'] 
env['LIBPATH']=[mklroot+'/lib/intel64',f95root ] 
env['LINKFLAGS'] = ['-Wl,--no-as-needed'] 

.. 

env.Program(target='prog', source=['file1.f90','file2.f90']) 

는 또한 나는 보통 이렇게 빌더와 LIBS (때로는 LIBPATH)를 지정 :이 : [포트란 태그]

env.Program(target='prog', source=['file1.f90','file2.f90'], 
      LIBS =['mkl_lapack95_lp64', 'mkl_gf_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread', 'm', 'dl'], 
      LIBPATH=[mklroot+'/lib/intel64',f95root ]) 
+0

답변 해 주셔서 감사합니다.당신의 방법은 LIBPATH 명세를'env [ 'LIBPATH'] = [f95root + '/ lib/intel64', mklroot + '/ lib/intel64']'(그리고 빌더에 LIBS와 LIBPATH를 지정하지 않고) 수정함으로써 이루어졌다. 'env [ 'LIBPATH']'리스트의 요소의 순서는 커맨드 라인에서'-L' 옵션으로 순서대로 나타나기 때문에 중요합니다.'libmkl_intel_thread.a'와 같은 이름의 파일도 있습니다. 서로 다른 내용)을 제공합니다. 나는 'f95root +'/ lib/intel64 '아래에있는 것을 링크해야한다. 그래서, 먼저 그것을 넣어야했습니다. – norio

+0

좋아요! 위의 해결 방법이 있다면 답변으로 표시 하시겠습니까? – bdbaddog