불행히도 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과 동적으로 링크 할 수 있어야합니다.
출처
2013-01-15 05:07:55
mvp
나는 귀하의 답변을 잘 따랐는지 확실하지 않습니다. 모듈이 런타임에 올바르게 작동하는지 어떻게 보증 할 수 있습니까? – Blaskovicz
'rpath' 또는'LD_LIBRARY_PATH'를 사용하십시오. –
둘 다 라이브러리의 검색 경로를 다른 방식으로 수정하지 마십시오. 나는 상자 X (libpq를 가지고있다)에 모듈을 만들고 상자 Y (libpq가 없다)에서 모듈을 만들고 싶다. 어쩌면 나는 따르지 않을 것이다. 나는 어떤 방법 으로든 링크/컴파일에 능숙한 슈퍼가 아니다. – Blaskovicz