2013-01-15 1 views
2

저는 Makefile.PL을 통해 리눅스 호스트에 DBD :: Pg를 빌드하려고합니다. 내 요구 사항은 perl과 동적으로 링크 할 수 있어야하지만, libpq.so와 정적으로 연결됩니다 (모든 상자에서 사용 가능하지 않을 수 있기 때문에).정적으로 DBD :: Pg (libpq.so)를 정적으로 연결하지만 Perl과 동적으로 연결 하시겠습니까?

쉬운 방법이 있나요? Makefile.PL의 LIBS 지시문에서 링크 옵션을 변경해 보았지만 MakeMaker는 옵션을 무시합니다.

답변

2

IMO 요구 사항을 잘못 지정했습니다.

모든 시스템에서 사용할 수 없기 때문에 libpq에 정적으로 링크하지 않아도됩니다. 당신이 일반적으로 대신 할 일은 입니다

동적 libq에 연결하고 하나 래퍼 스크립트에서 LD_LIBRARY_PATH를 설정하거나 찾을 수 있습니다 libpq 있도록 rpath 연결을 사용합니다.

는 알고 있어야하지만 그 어떤 다른 모듈이 동일한 펄로 libpq을로드하면 정적 또는 동적으로 연결 여부를 당신거야 중 호환되지 않는 두 개의 libpq들 같은 실행 파일 (붐) 또는 libpq를 사용하여 모듈 중 하나에 링크 얻을 컴파일 된 것 이외에도 (붐). rpath 연결을 사용하는 경우 ld.so의 링크 범위에 대한 인식으로 멀리 할 수 ​​있지만 LD_LIBRARY_PATH을 설정하면 거의 확실하게 문제가 발생합니다.

rpath$ORIGIN을 사용하는 것이 좋습니다.

+0

나는 귀하의 답변을 잘 따랐는지 확실하지 않습니다. 모듈이 런타임에 올바르게 작동하는지 어떻게 보증 할 수 있습니까? – Blaskovicz

+0

'rpath' 또는'LD_LIBRARY_PATH'를 사용하십시오. –

+0

둘 다 라이브러리의 검색 경로를 다른 방식으로 수정하지 마십시오. 나는 상자 X (libpq를 가지고있다)에 모듈을 만들고 상자 Y (libpq가 없다)에서 모듈을 만들고 싶다. 어쩌면 나는 따르지 않을 것이다. 나는 어떤 방법 으로든 링크/컴파일에 능숙한 슈퍼가 아니다. – Blaskovicz

2

불행히도 libpq의 정적 연결을 시도하면 큰 문제가 해결되지 않을 수 있습니다.

libpq 자체는 libc (glibc)에 의존 할 가능성이 큽니다. 정적으로 링크하지만 다른 모듈을 동적으로 연결하면 libc의 사본 2 개가 있습니다. 하나는 libpq이고 다른 하나는 Perl 자체에서 참조하고 동적으로로드됩니다. 특히 어떤 프로 시저가 malloc을 사용하여 메모리를 할당하고 포인터를 호출자에게 다시 전달하는 경우 매우 위험한 상황입니다. libc의 복사본에서 malloc에 ​​의해 할당 된 메모리가 있지만 다른 복사본으로 free이 작성되면 프로그램 (및 Perl)이 확실히 중단됩니다. 그래서 응용 프로그램에서 libc의 사본을 사용, 100 % 정적으로 컴파일해야합니다, 모든 - 정적 가고 싶은 경우 즉

는, 당신은 을 통해 모든 길을 갈해야합니다. 반대의 경우는 사실입니다. 동적 인 경우 모든 것이 동적이어야하며 libc 사본 한 개만 사용하면됩니다. 이 규칙은 라이브러리가 libc (sprintf조차도 포함하지 않음)을 사용하지 않는 경우에만 적용됩니다.

정적 인 libpq 컴파일에서 성공하더라도 잘 작동하지 않을 경우 DBI이 설치되지 않으면 어떻게됩니까? DBI가 기본적으로 존재하지 않는 충분한 리눅스 박스를 보았습니다. DBI를 정적으로 컴파일합니까? Perl이없는 경우 (Linux에서는 발생하지 않음), 또는 매우 오래된 경우 어떻게해야합니까?홈 디렉토리에 자신의 펄을 설치 - 당신은 질문에, 어쩌면 당신은 perlbrew을 사용하는 것이 좋습니다 호스트의 루트가없는 경우

sudo apt-get install libdbd-pg-perl # Ubuntu/Debian 
sudo yum install perl-DBD-Pg   # Redhat/Fedora 

:

적절한 솔루션은 기본 OS 패키지 관리자를 사용하여 설치하는 것입니다. 이를 통해 자신의 libpq 복사본을 컴파일하고 perlbrew에서 제공하는 Perl과 동적으로 링크 할 수 있어야합니다.

+0

문제에 대한 좋은 설명은 정적 연결, +1 –