2012-10-20 5 views
2

gfortran을 사용하여 공유 라이브러리를 만들고 이식성을 위해 libgfortran의 정적 버전과 연결하려고합니다. 불행히도, 나는 다른 객체들을 적절하게 링크 할 수 없다. 비슷한 문제를 다루는 게시물을 이미 찾았지만 문제를 해결하는 방법을 찾지 못했습니다.정적 라이브러리와 연결된 공유 라이브러리 : 재배치 오류

내 소스 파일은 모두 -fPIC 플래그로 컴파일됩니다. 내가 플래그 -shared-static-libgfortran와 개체를 연결하려고 할 때, 나는 다음과 같은 오류 메시지가 얻을 : 내가 gfortran 4.6.3을 사용하고

gfortran -shared -static-libgfortran file1.o file2.o file3.o -o "mynewlib.so" 
/usr/bin/ld: ../lib64/libgfortran.a(error.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC 
../lib64/libgfortran.a: could not read symbols: Bad value 
collect2: ld returned 1 exit status 

, 내 서버에 처음부터 컴파일 된 것을합니다. 설치가 원활하게 진행되었고 표준 구성이 변경되지 않았습니다. 이전 게시물에서 컴파일러는 --with-pic으로 구성되어야하지만이 플래그는 GCC manual에 언급되어 있지 않습니다.

컴파일러 또는 다른 개체를 연결하는 방식에서 문제가 발생합니까? 어떻게하면이 문제를 해결할 수 있을지 생각해?

도움을 주셔서 감사합니다.

답변

2

정적 버전을 사용할 때 libgfortran-fPIC 플래그로 컴파일되지 않으므로 (위치 불일치 코드가 포함되지 않음).

따라서 libfgortran (정적으로)을 공유 객체에 연결할 수 없습니다.

라이브러리를 올바르게 패키지화하고 (예 : 데비안 또는 우분투의 경우 .deb 파일) 패키지의 종속성에 gfortran을 추가하는 것이 좋습니다.

+0

내 추측이지만'-fPIC'로 컴파일 된'libgfortran '버전을 얻는 방법은 무엇입니까? – remek

+0

소스 코드에서 GCC 컴파일을 고려하고 수동으로 몇 가지 플래그를 조정할 수 있습니다 (아마도 ../gcc-4.7/configure CFLAGS = '- fPIC'....). 그러나 나는 실제로 이것이 노력할 가치가 없다고 생각합니다 . –

+0

내 문제에 대한 자세한 내용 : 매우 오래된 버전의 GCC가 설치된 서버에서이 라이브러리를 공유하고 있는데이 코드는 너무 오래되어 내 코드를 컴파일 할 수 없습니다. 방금이 문제를 해결하기 위해 최신 버전의 GCC를 설치했지만 동료들도 libgfortran의 공유 버전에 액세스해야합니다. 자체 포함 된 공유 라이브러리가있는 것이 더 쉬울 것이라고 생각했습니다. 오히려 그렇게하지 않겠습니까? 대안은 무엇입니까? 'libgfortran'도 그들과 공유하고 있습니까? – remek

관련 문제