update : 2015.11.03
php.shukuma.com

검색:
 
 
빌드 시 문제

빌드 시 문제

이 절은 빌드 시에 가장 자주 발생하는 에러에 대해서 정리합니다.

  1. 익명 CVS 서버스에서 PHP의 가장 최종 버전을 가져왔습니다. 그런데 거기에는 configure 스크립트가 없네요!?
  2. 아파치와 연동하여 PHP 를 설정하려 하는데 문제가 발생합니다. httpd.h를 찾을 수 없다는 군요. 하지만 그 파일은 거기에 있거든요!
  3. PHP를 설정하려 하는데 (./configure), 다음과 같은 에러 를 본적이 있습니까? checking lex output file root... ./configure: lex: command not found configure: error: cannot find output from lex; giving up
  4. 제가 아파치를 시작하려하면, 다음과 같은 메시지가 뜹니다. fatal: relocation error: file /path/to/libphp4.so: symbol ap_block_alarms: referenced symbol not found
  5. configure를 실행하려하는데, GD, gdbm 이나 다른 패키지에 대한 라이브러리(library)와 인클루드(include) 파일을 읽지 못한다는 에러가 나네요!
  6. language-parser.tab.c파일을 컴파일할때, yytname undeclared라는 에러메시지를 보여주네요.
  7. make명령을 실행시킬때, 처음엔 잘나가다가 마지막에서 프로그램을 링크하려고 할때 특정 파일을 찾지 못한다고 하며 종료되어 버립니다.
  8. PHP를 링크할때, 엄청나게 많은 수의 undefined reference 에러메시지를 뿌려줍니다.
  9. 아파치 1.3 버전과 같이 설치하는 방법을 잘 모르겠습니다.
  10. 유닉스에서 아파치 모듈을 인스톨하기 위한 모든 단계를 따라했습니다. 그리고 브라우저에서 PHP 스크립트를 보려고하면 저장하겠냐고 묻습니다.
  11. --activate-module=src/modules/php4/libphp4.a옵션으로 실행하라고 하지만 그 파일은 존재하지않습니다. 그래서 --activate-module=src/modules/php4/libmodphp4.a으로 변경을 했습니다. 근데, 제대로 설치가 안되네요!? 무엇이 잘못되었나요?
  12. PHP를 정적인 모듈로 아파치와 연동하려고 --activate-module=src/modules/php4/libphp4.a 옵션으로 빌드하려 했습니다. 그런데 컴파일러가 ANSI 호환이 아니라고 나옵니다.
  13. --with-apxs옵션으로 PHP를 빌드하려고 하는데 이상한 메시지를 봤습니다.
  14. make명령 실행 중에 몇몇개의 에러메시지와 많은 RUSAGE_관련 에러 메시지가 발생합니다.
  15. MySQL과 연동하여 PHP를 컴파일하려고 할때 configure는 잘 진행되지만 make명령 실행중에는 다음과 같은 에러가 납니다. ext/mysql/libmysql/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysql/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp', 무엇이 잘못된 건가요?
  16. PHP를 업그레이드 하고 싶습니다. 현재 PHP 설치를 위해 사용되었던 ./configure 실행 옵션을 어디서 발견할수 있습니까?
  17. GD라이브러리와 연동하여 PHP를 빌드하려 하면 이상한 컴파일 에러를 보이거나 실행중 세그먼테이션 폴트(segfault)를 발생시킵니다.
  18. PHP를 컴파일 할 때 여러 오류가 나면서 멈춥니다. 솔라리스를 사용하고 있습니다.
익명 CVS 서버스에서 PHP의 가장 최종 버전을 가져왔습니다. 그런데 거기에는 configure 스크립트가 없네요!?

configure.in파일이 configure 스크립트를 생성할수 있도록 GNU autoconf 패키지가 설치되어 있어야 합니다. 그리고 나서 CVS 서버에서 소스를 가져오신 후에 최상위 디렉토리에서 ./buildconf명령을 실행하세요. (또한, --enable-maintainer-mode옵션으로 configure를 실행하지 않으면, configure.in파일이 갱신되었을때, configure 스크립트는 자동적으로 재생성 되지 않을겁니다. 그래서 configure.in 파일이 갱신되었다는것을 알고나서 손수 재생성해야 할것입니다. 이것을 알아챌수 있는 방법은 configure 나 config.status이 실행된후 Makefile의 @VARIABLE@같은 것을 찾아 보는 것입니다.)

아파치와 연동하여 PHP 를 설정하려 하는데 문제가 발생합니다. httpd.h를 찾을 수 없다는 군요. 하지만 그 파일은 거기에 있거든요!

configure/setup 스크립트에 아파치 소스 트리의 최상위 디렉토리 위치를 알려줘야 합니다. 즉, --with-apache=/path/to/apache 을 적어주세요. --with-apache=/path/to/apache/src아닙니다.

PHP를 설정하려 하는데 (./configure), 다음과 같은 에러 를 본적이 있습니까?

checking lex output file root... ./configure: lex: command not found
configure: error: cannot find output from lex; giving up

installation섹션을 주의깊게 읽어보세요. PHP를 컴파일하기 위해서는 flex와 bison 이 필요합니다. bison과 flex를 소스나 RPM패키지를 구해서 설치하세요.

제가 아파치를 시작하려하면, 다음과 같은 메시지가 뜹니다.

fatal: relocation error: file /path/to/libphp4.so:
symbol ap_block_alarms: referenced symbol not found

이 에러는 공유 사용 목적의 DSO 라이브러리로 아파치 프로그램을 컴파일 할때 주로 발생합니다. 아파치를 재설정(reconfigure)하세요 최소한 다음 옵션이 붙어야 합니다.


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

더 자세한 정보는 아파치 디렉토리의 최상위에 위치한 INSTALL 파일이나 아파치 » DSO 매뉴얼 페이지를 보세요.

configure를 실행하려하는데, GD, gdbm 이나 다른 패키지에 대한 라이브러리(library)와 인클루드(include) 파일을 읽지 못한다는 에러가 나네요!

비표준적인 위치에 존재하는 헤더파일이나 라이브러리를 찾을 수 있도록 configure 스크립트를 조정할수 있습니다. C 전처리기나 링커를 넘겨주기 위한 다음과같은 플래그를 설정함으로써 가능합니다.

    CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
로그인 셸이 csh계열이라면(왜?) 다음처럼 처리합니다
    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'이라는 옵션을 빠뜨리거나, 데이터베이스 지원을 위한 라이브러리를 빠뜨린 경우가 대부분입니다.

아파치 1.2.x에 설치한다면, 설정 파일의 EXTRA_LIBS에 적절한 정보를 추가하여 아파치 설정 스크립트를 다시 실행하셨습니까? 제사한 정보는 설치 챕터를 참고하십시오.

어떤분들의 보고에 따르면 아파치와 같이 설치할때에는 libphp4.a파일 다음에 '-ldl'옵션을 추가해야한다고 합니다.

아파치 1.3 버전과 같이 설치하는 방법을 잘 모르겠습니다.

매우 쉽습니다. 다음 단계를 차근차근 따라해보세요.

  • » http://httpd.apache.org/download.cgi에서 아파치 1.3 최신 버전을 다운받는다.
  • 그 파일을 특정 디렉토리에 압축을 풉니다. 예를 들면, /usr/local/src/apache-1.3와 같은 디렉토리가 될수 있습니다.
  • 우선 다음명령을 실행시킵니다. ./configure --with-apache=/<path>/apache-1.3 (여기서 <path>는 아파치 1.3 디렉토리의 실제 경로로 대치하십시오.
  • 그리고 make명령과 make install명령을 차례대로 실행시킵니다. 이것이 완료되면 아파치의 하위 디렉토리에 필요한 파일들이 복사가 되는것입니다.
  • /<path>/apache-1.3/src디렉토리로 들어가서 Configuration파일을 변경하십시오. 설정 파일에 다음줄을 추가하세요. AddModule modules/php4/libphp4.a.
  • Type: ./configure명령실행후에 make명령을 실행하면 됩니다.
  • 이제 PHP가 연동되는 아파치 실행파일이 생겼을겁니다!

Note: 새로운 아파치의 ./configure스크립트 를 사용할수 있습니다. 아파치 디렉토리의 README.configure파일을 보거나, PHP 디렉토리의 INSTALL파일을 참고하세요.

유닉스에서 아파치 모듈을 인스톨하기 위한 모든 단계를 따라했습니다. 그리고 브라우저에서 PHP 스크립트를 보려고하면 저장하겠냐고 묻습니다.

이것은 어떤 이유로 PHP 모듈을 제대로 불려오지 못한 결과입니다. 우선은 다음의 세가지 경우를 체크하시기 바랍니다

  • 현재 실행되고있는 아파치의 실행파일이 새로 빌드된 실행파일인지 확인해야 합니다. 다음 명령을 실행하세요 /path/to/binary/httpd -l 출력된 리스트중에서 mod_php4.c파일이 보이지 않으면, 잘못된 파일을 실행하고 있는것입니다. 올바른 파일을 찾아서 실행하세요.
  • 아파치의 .conf파일에 다음과 같은 Mime 타입 설정을 추가했는지 확인하세요. AddType application/x-httpd-php .php 그리고 <Virtualhost> 이나 <Directory> 블록안에 이 AddType 줄이 숨겨져 있는지 확인하시기 바랍니다. 이렇게 되면 PHP 스크립트의 위치에 따라서 적용이 안될수 있기 때문입니다.
  • 마지막으로, 아파치 1.2와 아파치 1.3 버전간에 설정파일의 기본(default) 디렉토리가 바뀔수도 있습니다. 따라서 실질적으로 AddType 줄이 추가된 설정파일이 정확한 위치에 있는지 체크해야 합니다. httpd.conf파일에 일부러 문법에러(Syntax error)를 일으킬만한 설정을 해보거나 다른 방법으로 이 파일이 실제로 적용되는 파일인지 확인할수 있습니다.

--activate-module=src/modules/php4/libphp4.a옵션으로 실행하라고 하지만 그 파일은 존재하지않습니다. 그래서 --activate-module=src/modules/php4/libmodphp4.a으로 변경을 했습니다. 근데, 제대로 설치가 안되네요!? 무엇이 잘못되었나요?

처음에는 libphp4.a파일은 존재하지 않습니다. 그 파일은 아파치 설치 과정중에 생기는것입니다!

PHP를 정적인 모듈로 아파치와 연동하려고 --activate-module=src/modules/php4/libphp4.a 옵션으로 빌드하려 했습니다. 그런데 컴파일러가 ANSI 호환이 아니라고 나옵니다.

이 에러 메시지는 잘못된 것입니다. 요즘의 아파치버전은 이런 에러 메시지가 수정되었다고 합니다.

--with-apxs 옵션으로 PHP를 빌드하려고 하는데 이상한 메시지를 봤습니다.

이경우에는 다음 세가지 경우를 확인해봐야 합니다. 첫째, 아파치가 apxs 펄 스크립트를 빌드 할때, 어떤 이유로 종종 적절한 컴파일러와 플래그 변수(flag variables)들 없이 끝나버리는 경우가 있습니다. ( 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 
두번째는 레드햇 6.1과 레드햇 6.2에 관련된 경우입니다. 레드햇 배포판의 apxs가 깨지는 경우인데. 다음처럼 되어있습니다
my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install
이렇다면 다음으로 변경합니다
my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install
마지막으로, 아파치를 재설정/재설치했을경우에 make clean 명령을 ./configure 명령 후와 make 명령 전에 실행해보는 것입니다.

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-devel 패키지를 설치해서 /usr/include밑의 파일들을 고칠필요가 있습니다. 이것이 PHP를 위해 절대적인것은 아닙니다. 이런것을 해결하기 위해서는 다음과 같은 테스트를 해보세요.

$ cat >test.c <<X
#include <sys/resource.h>
X
$ gcc -E test.c >/dev/null
이 테스트 결과 에러가 발생한다면 그 include파일들은 확실히 정상이 아닙니다.

MySQL과 연동하여 PHP를 컴파일하려고 할때 configure는 잘 진행되지만 make명령 실행중에는 다음과 같은 에러가 납니다. ext/mysql/libmysql/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysql/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp', 무엇이 잘못된 건가요?

우선, 이것이 경고(Warning)이고 치명적인 에러(Fatal Error)가 아니라는 것을 파악하는 것이 중요합니다. 이 메시지들이 make명령이 실행되는 동안 종종 마지막에 나오기 때문에 치명적인 에러(Fatal Error)처럼 보일지도 모르지만, 그렇지는 않습니다. 즉 컴파일러가 경고(Warning)메시지를 안보이도록 할수 있다면, 아무 메시지도 보여주지 않게 되는것입니다. 또 명심할것은 MySQL 은 기본적으로(default) 지원이 된다는것입니다.

Note:

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(); ?>
이 스크립트의 결과 페이지에서 상단에 ./configure실행 옵션이 보이므로 그 옵션을 쓰시면 됩니다.

GD라이브러리와 연동하여 PHP를 빌드하려 하면 이상한 컴파일 에러를 보이거나 실행중 세그먼테이션 폴트(segfault)를 발생시킵니다.

GD라이브러리와 PHP가 관련 라이브러리(예를 들면, libpng)와 제대로 링크가 되었는지 확인하십시오.

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

PHP를 컴파일 할 때 GNU 유틸리티를 사용하지 않으면 문제가 발생할 수 있습니다. PHP를 컴파일할 때 적합한 GNU 툴을 사용하는지 확인해 보십시오. 예를 들어, 솔라리스에서 사용하는 SunOS BSD-호환이나 솔라리스 버전의 sed는 적합하지 않습니다. GNU나 Sub POSIX (xpg4) 버전의 sed을 사용해야 합니다. 연결: » GNU sed, » GNU flex, » GNU bison.