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는 정말 똑똑 경우 옵션, 플래그의 순서를 알아낼 수 및 인수 항상 성공적하기 .
나는 태그를 가진 정말 가치라고 생각합니다. 리눅스 대신 gfortran을 사용했는지 아니면 대신 다른 리눅스를 사용할지 결정하십시오. Scons는 개별 컴파일러를 신경 쓰지 않습니다. –
O.K. 고맙습니다. 괜찮아. 나는 fortran 또는 gfortran 태그 중 어느 것을 넣어야할지 궁금해했다. 둘 다 가지고있는 것이 좋다. – norio
문제의 라이브러리 위치에 LIBPATH를 사용하지 않는 이유는 무엇입니까? (libmkl_lapack95_lp64.a) – bdbaddog