PHP 매뉴얼
이전 |  | 다음

# 49. 장. 빌드(build)시의 문제

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

1. 익명 CVS 서버스에서 PHP의 가장 최종 버전을 가져왔습니다. 그런데 거기에는 configure 스크립트가 없네요!?
2. 아파치와 연동하여 PHP 를 설정하려 하는데 문제가 발생합니다. `httpd.h`를 찾을 수 없다는 군요. 하지만 그 파일은 거기에 있거든요!
3. PHP를 설정하려 하는데 (`./configure`), 다음과 같은 에러 를 본적이 있습니까?
4. 제가 아파치를 시작하려하면, 다음과 같은 메시지가 뜹니다.
5. configure를 실행하려하는데, GD, gdbm 이나 다른 패키지에 대한 라이브러리(library)와 인클루드(include) 파일을 읽지 못한다는 에러가 나네요!
6. `language-parser.tab.c`파일을 컴파일할때, `yytname undeclared`라는 에러메시지를 보여주네요.
7. make명령을 실행시킬때, 처음엔 잘나가다가 마지막에서 프로그램을 링크하려고 할때 특정 파일을 찾지 못한다고 하며 종료되어 버립니다.
8. PHP를 링크할때, 엄청나게 많은 수의 undefined reference 에러메시지를 뿌려줍니다.
9. 아파치 1.3 버전과 같이 설치하는 방법을 잘 모르겠습니다.
10. UNIX상에서 아파치 모듈을 인스톨하기 위한 모든 단계를 따라했습니다. 그리고 브라우저에서 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. When compiling PHP I seemingly get random errors, like it hangs. I'm using Solaris if that matters.

1. 익명 CVS 서버스에서 PHP의 가장 최종 버전을 가져왔습니다. 그런데 거기에는 configure 스크립트가 없네요!?

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

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

configure/setup 스크립트에게 아파치 소스 트리의 최상위 디렉토리의 위치를 알려줄 필요가 있습니다. 즉, `--with-apache=/path/to/apache`을 적어주세요. `--with-apache=/path/to/apache/src`이 아닙니다.

3. 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패키지를 구해서 설치하세요.

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

    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 manual page를 보세요.

5. 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

6. `language-parser.tab.c`파일을 컴파일할때, `yytname undeclared`라는 에러메시지를 보여주네요.

Bison 을 업그레이드할필요가 있습니다. http://www.gnu.org/software/bison/bison.html에서 최신버전을 받을수 있을겁니다.

7. make명령을 실행시킬때, 처음엔 잘나가다가 마지막에서 프로그램을 링크하려고 할때 특정 파일을 찾지 못한다고 하며 종료되어 버립니다.

make의 구버전 중 일부는 functions 디렉토리안에 functions 디렉토리에 들어있는 파일을 정확하게 옮겨놓지 못합니다. cp *.o functions 명령을 실행하고 나서 make명령을 재실행시켜보세요. 이래도 똑같은 증상을 보이면, GNU make를 최신버전으로 업그레이드하세요

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

링크 관련 줄을 보고 정확하게 라이브러리가 설정되었는지 확인하기 바랍니다. 보통 '-ldl'이라는 옵션을 빠뜨리거나, 데이터베이스 지원을 위한 라이브러리를 빠뜨린 경우가 대부분입니다.

아파치 1.2.x 버전과 같이 설치하는것이라면, 설정파일의 EXTRA_LIBS에 적절한 정보를 추가했는지, 아파치 설정 스크립트를 재실행했는지 확인하세요. 아파치에 포함되어있는 INSTALL파일을 확인하는것도 도움이 될것입니다.

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

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

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

- http://www.apache.org/dist/httpd/에서 아파치 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`파일을 참고하세요.

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

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

- 현재 실행되고있는 아파치의 실행파일이 새로 빌드된 실행파일인지 확인해야 합니다. 다음 명령을 실행하세요 `/path/to/binary/httpd -l`

  출력된 리스트중에서 `mod_php4.c`파일이 보이지 않으면, 잘못된 파일을 실행하고 있는것입니다. 올바른 파일을 찾아서 실행하세요.

- `아파치의 .conf`파일에 다음과 같은 Mime 타입 설정을 추가했는지 확인하세요. `AddType application/x-httpd-php3 .php3` (for PHP 3)

  또는 `AddType application/x-httpd-php .php` (for PHP 4)

  그리고 <Virtualhost> 이나 <Directory> 블록안에 이 AddType 줄이 숨겨져 있는지 확인하시기 바랍니다. 이렇게 되면 PHP 스크립트의 위치에 따라서 적용이 안될수 있기 때문입니다.

- 마지막으로, 아파치 1.2와 아파치 1.3 버전간에 설정파일의 기본(default) 디렉토리가 바뀔수도 있습니다. 따라서 실질적으로 AddType 줄이 추가된 설정파일이 정확한 위치에 있는지 체크해야 합니다. `httpd.conf`파일에 일부러 문법에러(Syntax error)를 일으킬만한 설정을 해보거나 다른 방법으로 이 파일이 실제로 적용되는 파일인지 확인할수 있습니다.

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

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

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

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

13. `--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 명령 전에 실행해보는 것입니다.

14. 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파일들은 확실히 정상이 아닙니다.

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', 무엇이 잘못된 건가요?

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

16. PHP를 업그레이드 하고 싶습니다. 현재 PHP 설치를 위해 사용되었던 ./configure 실행 옵션을 어디서 발견할수 있습니까?

현재 PHP설치 디렉토리의 config.nice 파일이나 다음스크립트를 실행시키면 확인할수 있습니다.

    <?php phpinfo(); ?>

이 스크립트의 결과 페이지에서 상단에 ./configure실행 옵션이 보이므로 그 옵션을 쓰시면 됩니다.

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

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

18. When compiling PHP I seemingly get random errors, like it hangs. I'm using Solaris if that matters.

Using non-GNU utilities while compiling PHP may cause problems. Be sure to use GNU tools in order to be certain that compiling PHP will work. For example, on Solaris, using either the SunOS BSD-compatible or Solaris versions of `sed` will not work, but using the GNU or Sun POSIX (xpg4) versions of `sed` will work. Links: GNU sed, GNU flex, and GNU bison.

이전 | 처음으로 | 다음
설치 | 위로 | PHP 사용하기