내 서버에서 PHP 5.3.13을 컴파일하고 있습니다. autonome php5 폴더를 만들고 싶습니다. 따라서 접두사는 다음과 같습니다.
/usr/local/php5
이 폴더에는 PHP를 실행하는 데 필요한 모든 lib를 저장하는 lib 폴더가 있습니다. 예를 들면 다음과 같습니다.
libk5crypto.so.3
libxml2.so.2
libjpeg.so.62 ....
.php 로 컴파일하더라도 --with-jpeg-dir=/usr/local/php5/lib/
PHP 바이너리는 여전히 찾고 있습니다 /usr/lib64
.
지금까지 찾은 유일한 해결책은 수동으로 내보내는 것입니다.LD_LIBRARY_PATH=/usr/local/php5/lib
컴파일 타임에도 동일한 일이 자동으로 발생하길 원합니다. 그게 가능합니까?
답변1
링커 경로에는 두 가지가 있습니다.엮다시간, 그리고달리기시간.
나는 autoconf( configure
)가 대체 라이브러리 위치를 사용하여 올바른 작업을 수행하도록 설정되는 경우가 거의 없다는 것을 발견했습니다. --with-something=
일반적으로 다음을 사용합니다.아니요올바른 링커 플래그( -R
또는 -Wl,-rpath
)를 생성하세요. 라이브러리 만 있으면 .a
작동하지만 .so
라이브러리의 경우 지정해야 할 것은 다음과 같습니다 RPATH
.
export PHP_RPATHS=/usr/local/php5/lib
./configure [options as required]
(많은 경우 그냥 명령어 LDFLAGS
에 추가하는 방식을 사용하는데, PHP의 빌드 과정은 약간 다릅니다.)configure
LD_LIBRARY_PATH
이는 마치 이러한 경로가 기본 링커 구성( ) /etc/ld.so.conf
에 지정된 것처럼 각 바이너리에 추가 링커 검색 경로를 효과적으로 추가합니다 . 또한 컴파일 시간과 런타임이 동일한 디렉터리의 라이브러리를 사용 -L/usr/local/php5/lib
하도록 추가 작업도 처리합니다 LDFLAGS
(다른 위치에 있는 버전이 일치하지 않으면 문제가 발생할 수 있지만 여기서는 걱정할 필요가 없습니다).
빌드가 완료되면 다음을 확인할 수 있습니다.
$ objdump -j dynamic -x ./sapi/cli/php | grep RPATH
RPATH /usr/local/php5/lib
$ objdump -j dynamic -x ./libs/libphp5.so | fgrep RPATH
RPATH /usr/local/php5/lib
실행하면 ldd
어떤 라이브러리가 어디서 로드되는지도 확인됩니다.
실제로 사용해야 하는 것은 컴파일러/링커가 요구하는 대로 추가된 일부 최상위 디렉토리, 디렉토리 , 및 기타 디렉토리를 --with-jpeg-dir
가리키는 것입니다 ./usr/local/
include/
lib/
설치를 찾을 수 없는 --with-jpeg-dir
경우 에만 구성이 자동 으로 다른(플랫폼별) "표준" 위치에서 이를 찾습니다. 귀하의 경우에는 libjpeg가 표준 위치에 있고 지시문이 자동으로 무시된다고 생각합니다 .configure
/usr/local
configure
(또한 PHP 5.3.13은 더 이상 최신 버전이 아니므로 현재 최신 버전인 5.3.21을 사용하는 것이 좋습니다.)