빌드 시 문제

이 섹션에서는 빌드 시 발생하는 가장 일반적인 오류를 정리합니다.

익명의 Git 서비스를 사용하여 최신 버전의 PHP를 얻었지만 구성 스크립트가 없습니다!

configure.in에서 구성 스크립트를 생성할 수 있도록 GNU autoconf 패키지가 설치되어 있어야 합니다. Git 서버에서 소스를 가져온 후 최상위 디렉토리에서 ./buildconf를 실행하기만 하면 됩니다. (또한 --enable-maintainer-mode 옵션으로 configure를 실행하지 않으면 configure.in 파일이 업데이트될 때 configure 스크립트가 자동으로 다시 빌드되지 않으므로 configure.in이 표시될 때 수동으로 수행해야 합니다. 이것의 한 가지 증상은 configure 또는 config.status가 실행된 후 Makefile에서 @VARIABLE@과 같은 것을 찾는 것입니다.)

Apache와 함께 작동하도록 PHP를 구성하는 데 문제가 있습니다. 그것은 그것이 httpd.h를 찾을 수 없다고 말하지만 그것이 내가 말한 바로 그곳에 있습니다!

Apache 소스 트리의 최상위 레벨 위치를 configure/setup 스크립트에 알려야 합니다. 이는 --with-apache=/path/to/apache/src아닌 --with-apache=/path/to/apache를 지정하려는 것을 의미합니다.

PHP(./configure)를 구성하는 동안 다음과 유사한 오류가 발생합니다.
                  
checking lex output file root... ./configure: lex: command not found
configure: error: cannot find output from lex; giving up
                  
                

설치 지침을 주의 깊게 읽고 PHP를 컴파일하려면 flex와 bison이 모두 설치되어 있어야 합니다. 설정에 따라 소스 또는 RPM과 같은 패키지에서 bison 및 flex를 설치합니다.

Apache를 시작하려고 하면 다음 메시지가 나타납니다.
                  
fatal: relocation error: file /path/to/libphp4.so:
symbol ap_block_alarms: referenced symbol not found
                  
                

이 오류는 일반적으로 Apache 핵심 프로그램을 공유 사용을 위한 DSO 라이브러리로 컴파일할 때 발생합니다. 최소한 다음 플래그를 사용하여 Apache를 재구성해 보십시오.

                  
--enable-shared=max --enable-rule=SHARED_CORE
                  
                

자세한 내용은 최상위 Apache INSTALL 파일 또는 Apache » DSO 매뉴얼 페이지를 참조하세요.

configure를 실행하면 GD, gdbm 또는 다른 패키지에 대한 포함 파일이나 라이브러리를 찾을 수 없다고 나옵니다!

다음과 같이 C 전처리기 및 링커에 전달할 추가 플래그를 지정하여 구성 스크립트가 비표준 위치에서 헤더 파일 및 라이브러리를 찾도록 할 수 있습니다.

                  
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
                  
                

로그인 셸에 csh-variant를 사용하는 경우(이유는?) 다음과 같습니다.

                  
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
                  
                
language-parser.tab.c 파일을 컴파일할 때 yytname undeclared라는 오류가 발생합니다.

Bison 버전을 업데이트해야 합니다. » http://www.gnu.org/software/bison/bison.html에서 최신 버전을 찾을 수 있습니다.

PHP를 링크할때, 엄청나게 많은 수의 undefined reference 에러메시지를 뿌려줍니다.

링크 라인을 살펴보고 마지막에 적절한 라이브러리가 모두 포함되어 있는지 확인하십시오. 놓쳤을 수 있는 일반적인 것들은 '-ldl'과 포함된 모든 데이터베이스 지원에 필요한 라이브러리입니다.

일부 사람들은 Apache와 연결할 때 libphp4.a 바로 다음에 '-ldl'을 추가해야 한다고 보고하기도 했습니다.

Unix에 Apache 모듈 버전을 설치하기 위한 모든 단계를 수행했으며 내 PHP 스크립트가 내 브라우저에 표시되거나 파일을 저장하라는 메시지가 표시됩니다.

이것은 어떤 이유로 PHP 모듈이 호출되지 않는다는 것을 의미합니다. 추가 도움을 요청하기 전에 확인해야 할 세 가지 사항:

  • 실행 중인 httpd 바이너리가 방금 빌드한 실제 새 httpd 바이너리인지 확인하십시오. 이렇게 하려면 다음을 실행하십시오. /path/to/binary/httpd -l mod_php4.c가 나열되지 않으면 올바른 바이너리를 실행하고 있지 않은 것입니다. 올바른 바이너리를 찾아 설치하십시오.
  • Apache .conf 파일 중 하나에 올바른 Mime 유형을 추가했는지 확인하십시오. 다음과 같아야 합니다. AddType application/x-httpd-php .php 또한 이 AddType 줄이 <Virtualhost> 또는 <Directory> 블록 안에 숨겨져 있어 테스트 스크립트의 위치에 적용되지 않도록 해야 합니다.
  • 마지막으로 Apache 구성 파일의 기본 위치는 Apache 1.2와 Apache 1.3 사이에서 변경되었습니다. AddType 행을 추가하는 구성 파일이 실제로 읽고 있는지 확인해야 합니다. httpd.conf 파일에 명백한 구문 오류를 넣거나 파일을 올바르게 읽고 있는지 알려주는 다른 명백한 변경 사항을 넣을 수 있습니다.
--activate-module=src/modules/php4/libphp4.a를 사용한다고 되어 있지만 해당 파일이 존재하지 않으므로 --activate-module=src/modules/php4/libmodphp4.a로 변경하고 작동하지 않습니다!? 무엇이 잘못되었나요?

libphp4.a 파일은 존재하지 않아야 합니다. 아파치 프로세스가 생성합니다!

--activate-module=src/modules/php4/libphp4.a 를 사용하여 PHP를 정적 모듈로 사용하여 Apache를 빌드하려고 하면 내 컴파일러가 ANSI와 호환되지 않는다는 메시지가 표시됩니다.

이것은 최신 버전에서 수정된 Apache의 잘못된 오류 메시지입니다.

--with-apx를 사용하여 PHP를 빌드하려고 하면 이상한 오류 메시지가 나타납니다.

여기에서 세 가지를 확인해야 합니다. 첫째, 어떤 이유로 Apache가 apxs Perl 스크립트를 빌드할 때 적절한 컴파일러 및 플래그 변수 없이 빌드되는 경우가 있습니다. apxs 스크립트를 찾으십시오( which apxs 명령 시도). 때때로 /usr/local/apache/bin/apxs 또는 /usr/sbin/apxs에 있습니다. 그것을 열고 다음과 유사한 라인을 확인하십시오:

                  
my $CFG_CFLAGS_SHLIB  = ' ';          # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = ' ';          # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = ' ';          # substituted via Makefile.tmpl
                  
                

이것이 보이면 문제를 찾은 것입니다. 공백 또는 'q()'와 같은 기타 잘못된 값만 포함할 수 있습니다. 이 줄을 다음과 같이 변경하십시오.

                  
my $CFG_CFLAGS_SHLIB  = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = 'gcc';                   # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared);              # substituted via Makefile.tmpl
                  
                

두 번째 가능한 문제는 Red Hat 6.1 및 6.2에서만 발생하는 문제입니다. pxs 스크립트 Red Hat 배송이 손상되었습니다. 이 줄을 찾으십시오.

                  
my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install
                  
                

위의 줄이 보이면 다음과 같이 변경하십시오.

                  
my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install
                  
                

마지막으로 Apache를 재구성/재설치하는 경우 ./configure 이후 및 make 이전에 프로세스에 make clean을 추가하십시오.

make 하는 동안 마이크로타임 오류와 많은 RUSAGE_ 항목이 발생합니다.

make 부분을 설치하는 동안 다음과 유사한 문제가 발생하는 경우:

                  
microtime.c: In function `php_if_getrusage':
microtime.c:94: storage size of `usg' isn't known
microtime.c:97: `RUSAGE_SELF' undeclared (first use in this function)
microtime.c:97: (Each undeclared identifier is reported only once
microtime.c:97: for each function it appears in.)
microtime.c:103: `RUSAGE_CHILDREN' undeclared (first use in this function)
make[3]: *** [microtime.lo] Error 1
make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/master/php-4.0.1/ext'
make: *** [all-recursive] Error 1
                  
                

시스템이 고장났습니다. glibc와 일치하는 glibc-devel 패키지를 설치하여 /usr/include 파일을 수정해야 합니다. 이것은 PHP와 전혀 관련이 없습니다. 이것을 스스로 증명하려면 다음과 같은 간단한 테스트를 시도하십시오.

                  
$ cat >test.c <<X
#include <sys/resource.h>
X
$ gcc -E test.c >/dev/null
                  
                

오류가 발생하면 포함 파일이 엉망이라는 것을 알 수 있습니다.

MySQL을 사용하여 PHP를 컴파일할 때 configure는 잘 실행되지만 make 중에 다음과 유사한 오류가 발생합니다.

ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp',

무슨 문제인가요?

먼저 이것이 경고이며 치명적인 오류가 아님을 인식하는 것이 중요합니다. 이것은 종종 make 동안 마지막으로 표시되는 출력이기 때문에 치명적인 오류처럼 보일 수 있지만 그렇지 않습니다. 물론 컴파일러가 경고 시 죽도록 설정하면 그렇게 됩니다. 또한 MySQL 지원은 기본적으로 활성화되어 있음을 명심하십시오.

메모: PHP 4.3.2부터 빌드(make)가 완료된 후 다음 텍스트도 표시됩니다.

                  
Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).
                  
                
PHP를 업그레이드하고 싶습니다. 현재 PHP 설치를 빌드하는 데 사용된 ./configure 행은 어디에서 찾을 수 있습니까?

현재 PHP 설치의 소스 트리에서 config.nice 파일을 보거나, 사용할 수 없는 경우 다음을 실행하기만 하면 됩니다.

                  
<?php phpinfo(); ?>
                  
                

스크립트. 출력 상단에 이 PHP 설치를 빌드하는 데 사용된 ./configure 행이 표시됩니다.

GD 라이브러리로 PHP를 빌드할 때 이상한 컴파일 오류나 실행 시 segfault가 발생합니다.

GD 라이브러리와 PHP가 동일한 종속 라이브러리(예: libpng)에 대해 링크되어 있는지 확인하십시오.

PHP를 컴파일 할 때 여러 오류가 나면서 멈춥니다. 솔라리스를 사용하고 있습니다.

PHP를 컴파일하는 동안 GNU가 아닌 유틸리티를 사용하면 문제가 발생할 수 있습니다. PHP 컴파일이 작동하는지 확인하려면 GNU 도구를 사용해야 합니다. 예를 들어, Solaris에서 SunOS BSD 호환 또는 Solaris 버전의 sed는 작동하지 않지만 GNU 또는 Sun POSIX(xpg4) 버전의 sed는 작동합니다. 링크: » GNU sed, » GNU flex » GNU bison.