php는 ./configure --with-libxml-dir에 지정된 버전 대신 시스템 libxml에 연결됩니다.

php는 ./configure --with-libxml-dir에 지정된 버전 대신 시스템 libxml에 연결됩니다.

Debian 8 시스템의 소스에서 php-5.5.33을 빌드하려고 합니다. configure둘 다 make성공적으로 실행되지만 실행하면 make install다음 오류가 발생합니다.

Installing PEAR environment:      /usr/local/lib/php/
/usr/src/www/php/php-5.5.33/sapi/cli/php: symbol lookup error:     /usr/src/www/php/php-5.5.33/sapi/cli/php: undefined symbol: __xmlFree
Makefile:390: recipe for target 'install-pear-installer' failed
make[1]: *** [install-pear-installer] Error 127
Makefile:393: recipe for target 'install-pear' failed
make: *** [install-pear] Error 2

이것을 본 후 (dir 에서 /usr/src/www/php/php-5.5.33) 실행하여 ldd sapi/cli/php다음을 확인했습니다(대부분의 출력을 생략했습니다).

libxslt.so.1 => /usr/lib/x86_64-linux-gnu/libxslt.so.1 (0x00007efd9c207000)
libxml2.so.2 => /usr/lib/x86_64-linux-gnu/libxml2.so.2 (0x00007efd9bea0000)

소스에서 /usr/local, libxml2-2.9.3 및 libxslt-1.1.28 버전까지 로컬 설치 위치를 지정하기 위해 --with-libxml-dir및 옵션을 사용했기 때문에 이것을 보고 놀랐습니다. --with-xsl또한 출력에 다음과 같은 인스턴스가 많기 때문에 구성이 이 버전을 선택한 것 같습니다.

checking for xml2-config path... /usr/local/bin/xml2-config
checking whether libxml build works... yes

이제 make install위에 나열된 오류는 실행에서 일치하는 항목을 찾을 수 없기 때문에 기호가 __xmlFree시스템에 존재하지 않기 때문에 실제로 의미가 있습니다. 하지만 로컬에 설치한 버전은/usr/lib/x86_64-linux-gnu/libxml2.so.2readelf -s /usr/lib/x86_64-linux-gnu/libxml2.so | grep -i __xmlfree하다다음 기호가 포함되어 있습니다.

$ readelf -s /usr/local/lib/libxml2.so.2 | grep -i __xmlfree
1409: 00000000000e0b5c    35 FUNC    GLOBAL DEFAULT   12 __xmlFree
5249: 00000000000e0b5c    35 FUNC    GLOBAL DEFAULT   12 __xmlFree

혼란스러운 점은 sapi/cli/phplibxml2의 링크된 버전이 내가 지정한 버전과 다른 이유입니다 configure. 내 것은 /etc/ld.so.conf다음과 같습니다.

$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf

/etc/ld.so.conf.d... 다음과 같이 디렉터리를 하나의 파일로 병합했습니다 .

$ cat /etc/ld.so.conf.d/libs.conf
/usr/local/lib
/usr/lib/x86_64-linux-gnu/libfakeroot

...저는 또한 ldconfiglibxml2와 libxslt를 설치한 후, 그러나 php를 빌드하기 전에 이것을 실행했습니다. configure내가 사용하는 전체 내용은 다음과 같습니다 .

./configure --prefix=/usr/local \
CFLAGS="-O2 -mtune=native -funroll-loops -fPIC" \
--with-libdir=lib \
--with-apxs2=/usr/local/apache2/bin/apxs \
--disable-debug \
--disable-short-tags \
--enable-libgcc \
--enable-shared=yes \
--enable-calendar \
--enable-exif \
--enable-ftp \
--enable-gd-native-ttf \
--enable-mbstring \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-bz2 \
--with-curl=/usr/local \
--with-freetype-dir \
--with-gd \
--with-gnu-ld \
--with-iconv-dir=/usr/local \
--with-jpeg-dir=/usr/local \
--with-ldap=/usr/local \
--with-libxml-dir=/usr/local \
--with-mcrypt \
--with-mhash \
--with-openssl \
--with-openssl-dir=/usr/local \
--with-pear \
--with-pcre-regex=/usr/local \
--with-pcre-dir=/usr/local \
--with-png-dir=/usr/local \
--with-tidy \
--with-readline \
--with-tsrm-pthreads \
--with-xmlrpc \
--with-xsl=/usr/local \
--with-zlib \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--without-sqlite3 \
--without-pdo-sqlite

(또한 /usr/local로 지정된 모든 프로젝트에서 사용 가능한 시스템 버전이 있는 경우 PHP는 실제로 해당 프로젝트의 시스템 버전에도 연결됩니다. 해당 시스템 버전이 없는 프로젝트만 실제로 지정된 나에게 연결됩니다. 버전).

PHP 링크 버전이 내가 표시한 버전과 다른 이유는 무엇입니까? 이런 일이 발생하지 않았다면 make install.

답변1

나는매우Ubuntu 12의 PHP 5.5 및 컬과 비슷한 문제가 있습니다. /usr/local/curl-7.49.1.

사용이 --with-curl=/usr/local/curl-7.49.1예상대로 작동하지 않습니다 /usr/lib/x86_64-linux-gnu/libcurl.so. 생성된 바이너리가 .BTW에 연결되었습니다. 내 목표는 libcurl.a를 사용하여 컬을 PHP 바이너리에 정적으로 연결하는 것입니다(버전 문제를 피하기 위해). 그러나 이것이 문제의 원인은 아닙니다.

이 시점에서 환경 변수 설정을 사용하여 LDFLAGS빌드 테스트를 시작했습니다 export LDFLAGS=-L/usr/local/curl-7.49.1/lib. 이것도 작동하지 않고 결과는 이전과 동일합니다.

몇 가지 조사와 테스트를 거친 후(저는 autoconf/Makefile 전문가가 아닙니다 ;-) 빌드 프로세스 중에 libtool이 호출되는 것을 발견했습니다. libtool -L/usr/lib/x86_64-linux-gnu -L/usr/local/curl-7.49.1/lib [...]

--with-libs구성 스크립트의 매개변수는 다음과 같습니다.장소따라서 변수 이전에 LDFLAGSlibtool은 libcurl 파일을 가져오지 않고 기본 시스템에서 파일을 가져옵니다.

그래서 더 깊이 파고들어 EXTRA_LDFLAGS_PROGRAM대신 설정을 시도했습니다 LDFLAGS.

export EXTRA_LDFLAGS_PROGRAM=-L/usr/local/curl-7.49.1/lib

이제 빌드가 성공했습니다. 이것이 문제를 해결하는 올바른 방법인지, 아니면 버그이거나 잘못된 구성인지 모르겠습니다. 누군가가 나에게 이 점을 명확히 해준다면 나는 매우 기쁠 것이다.

따라서 상황이 완전히 동일하지는 않지만 구성을 시작하기 전에 다음을 시도해 보십시오.

export EXTRA_LDFLAGS_PROGRAM=-L/usr/local/lib/

이것이 도움이 된다면 알려주세요.

답변2

누군가 이 질문을 다시 찾아본다면 그 대답은 ./configure 명령의 --libdir= 매개변수에 있다고 확신합니다.

  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]

Ubuntu가 /usr/lib/x86_64-linux-gnu에 많은 라이브러리를 유지하기 때문에 --libdir=/usr/lib/x86_64-linux-gnu가 필요한 경우가 있습니다. 소스에서 libxml을 빌드하여 /usr/local에 배치했습니다. 다른 경우에 가장 간단한 해결책은 /usr/local/lib에서 /usr/lib/x86_64 -linux-gnu로 파일을 심볼릭 링크하는 것입니다.

관련 정보