2017-10-27 12 views
0

내가이 최소한의 TEST.C에 문제를 감소했습니다정적 링크

#include "png.h" 

int function() { 
    printf("%ld", (long)png_create_read_struct); 
} 

gcc -shared -fPIC test.c -o test.so -lm -l:libpng16.a 

로 컴파일 에러 이제

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/libpng16.a(pngread.o): relocation R_X86_64_PC32 against symbol `png_sRGB_table' can not be used when making a shared object; recompile with -fPIC 
/usr/bin/ld: final link failed: Bad value 

에게 제공 이 오류에서 발견 한 모든 대답은 "-fPIC으로 말하고 다시 컴파일하십시오."라고 말하지만, 이미 알 수 있듯이 이미 그렇게하고 있습니다. 그래서 무엇을 제공합니까?

(출력 위 libpng16와 우분투 17.10에서입니다. 우분투 16.04 유사한 오류 libpng12 결과로.)

+0

아니요, 이미 그렇게하지 않았습니다. 링커는'libpng16.a'에있는 객체들을 PIC로 만들고 싶지 않습니다. * 그것은'-fPIC'으로 다시 컴파일하기를 원하는 것입니다. –

+0

libpng 공유 라이브러리를 링크하지 않는 이유는 무엇입니까? –

+0

@JohnBollinger 그래서 apt 패키지에 포함 된 정적 라이브러리는 이것을 위해 준비되지 않았으며 정적으로 링크하려는 모든 것을 다시 컴파일해야합니다. 조금도. .a 파일이 -fPIC로 컴파일되었는지 확인할 방법이 있습니까? (추신 : 제발 답변을 귀하의 의견을주세요) –

답변

1

는 지금이 오류를 발견했습니다 모든 대답은 그것이 말하는 일을하고 다시 컴파일 "아래로 비등 -fPIC "과 함께 사용하지만, 이미 알 수 있듯이 이미 그렇게하고 있습니다. 그래서 무엇을 제공합니까? 내가 주석으로

, 아니, 사실 당신은 이미 그 일을하지입니다. 링커는 연결된 개체가 libpng16.a에서 PIC로 바뀌길 원합니다. -fPIC으로 다시 컴파일하기를 원하는 내용입니다.

libpng16.a과 같은 일반 보관 파일에 PIC 개체를 저장할 수는 있지만 이는 틀에 얽매이지 않습니다. 이러한 파일을 종종 "정적 라이브러리"라고 부르는 이유가 없습니다. 그것들은 공유 된 것들이 아닌 정적 인 바이너리를 만드는 것을 지원하기위한 것이고 PIC 객체에 의해 제공되지 않습니다. PIC 객체를 포함하기 위해 표준 패키지가 제공하는 아카이브를 기대해서는 안됩니다.

어떤 경우에도 공유 라이브러리를 작성하기 때문에 자연스럽고 적절한 방법은 공유 된 libpng 버전에 링크하는 것입니다. 대신에 정적 라이브러리를 연결하는 데 문제가 생겼지 만 그 이유는 분명하지 않습니다. 성취하고자하는 것은 무엇이든간에, 심지어 성취할만한 가치가있는 것이라면, 이것은 잘못 될 수 있습니다.

+0

마지막 질문에, 나는 더 이상 현재 리눅스 배포판에 패키지되지 않습니다 libpng의 이전 버전을 사용하여 파이썬 확장 기능을 패키지해야합니다. 정적 연결이 왜 잘못 될지 알지 못합니다. 다른 옵션도 있지만 배포를 복잡하게 만드는 모든 솔루션은 불편합니다. 물론 소스에서 libpng을 컴파일해야하는 것은 불편합니다. "덜 나쁜"해결책이 무엇인지 알아 내야 할 것입니다. –

+0

(오, 명백하지 않은 경우 파이썬 확장은 동적 라이브러리 여야합니다. 따라서 모든 정적은 옵션이 아닙니다) –

+0

@PedroLopes, 정적 라이브러리에 연결하는 것은 매우 간단합니다. 작동하지 않습니다. 올바른 접근 방식은 적절한 공유 라이브러리에 링크하는 것입니다. 동일한 공유 라이브러리의 서로 다른 버전이 시스템에 공존 할 수 있으며 일부 배포판은 특정 라이브러리에 대해 패키지를 제공하기도합니다. –