빌드(build)시의 문제
이 절은 빌드 시에 가장 자주 발생하는 에러에 대해서 정리합니다.
- ìµëª CVS ìë²ì¤ìì PHPì ê°ì¥ ìµì¢ ë²ì ì ê°ì ¸ììµëë¤. ê·¸ë°ë° 거기ìë configure ì¤í¬ë¦½í¸ê° ìë¤ì!?
- ìíì¹ì ì°ëíì¬ PHP 를 ì¤ì íë ¤ íëë° ë¬¸ì ê° ë°ìí©ëë¤. httpd.h를 ì°¾ì ì ìë¤ë êµ°ì. íì§ë§ ê·¸ íì¼ì 거기ì ìê±°ë ì!
- PHP를 ì¤ì íë ¤ íëë° (./configure), ë¤ìê³¼ ê°ì ìë¬ ë¥¼ 본ì ì´ ììµëê¹? checking lex output file root... ./configure: lex: command not found configure: error: cannot find output from lex; giving up
- ì ê° ìíì¹ë¥¼ ììíë ¤íë©´, ë¤ìê³¼ ê°ì ë©ìì§ê° ë¹ëë¤. fatal: relocation error: file /path/to/libphp4.so: symbol ap_block_alarms: referenced symbol not found
- configure를 ì¤ííë ¤íëë°, GD, gdbm ì´ë ë¤ë¥¸ í¨í¤ì§ì ëí ë¼ì´ë¸ë¬ë¦¬(library)ì ì¸í´ë£¨ë(include) íì¼ì ì½ì§ 못íë¤ë ìë¬ê° ëë¤ì!
- language-parser.tab.cíì¼ì ì»´íì¼í ë, yytname undeclaredë¼ë ìë¬ë©ìì§ë¥¼ ë³´ì¬ì£¼ë¤ì.
- makeëª ë ¹ì ì¤íìí¬ë, ì²ìì ìëê°ë¤ê° ë§ì§ë§ìì íë¡ê·¸ë¨ì ë§í¬íë ¤ê³ í ë í¹ì íì¼ì ì°¾ì§ ëª»íë¤ê³ íë©° ì¢ ë£ëì´ ë²ë¦½ëë¤.
- PHP를 ë§í¬í ë, ìì²ëê² ë§ì ìì undefined reference ìë¬ë©ìì§ë¥¼ ë¿ë ¤ì¤ëë¤.
- ìíì¹ 1.3 ë²ì ê³¼ ê°ì´ ì¤ì¹íë ë°©ë²ì ì ëª¨ë¥´ê² ìµëë¤.
- Unixììì ìíì¹ ëª¨ëì ì¸ì¤í¨í기 ìí 모ë ë¨ê³ë¥¼ ë°ë¼íìµëë¤. ê·¸ë¦¬ê³ ë¸ë¼ì°ì ìì PHP ì¤í¬ë¦½í¸ë¥¼ ë³´ë ¤ê³ íë©´ ì ì¥íê² ëê³ ë¬»ìµëë¤.
- --activate-module=src/modules/php4/libphp4.aìµì ì¼ë¡ ì¤ííë¼ê³ íì§ë§ ê·¸ íì¼ì ì¡´ì¬íì§ììµëë¤. ê·¸ëì --activate-module=src/modules/php4/libmodphp4.aì¼ë¡ ë³ê²½ì íìµëë¤. ê·¼ë°, ì ëë¡ ì¤ì¹ê° ìëë¤ì!? 무ìì´ ì못ëìëì?
- PHP를 ì ì ì¸ ëª¨ëë¡ ìíì¹ì ì°ëíë ¤ê³ --activate-module=src/modules/php4/libphp4.a ìµì ì¼ë¡ ë¹ëíë ¤ íìµëë¤. ê·¸ë°ë° ì»´íì¼ë¬ê° ANSI í¸íì´ ìëë¼ê³ ëìµëë¤.
- --with-apxsìµì ì¼ë¡ PHP를 ë¹ëíë ¤ê³ íëë° ì´ìí ë©ìì§ë¥¼ ë´¤ìµëë¤.
- makeëª ë ¹ ì¤í ì¤ì ëªëªê°ì ìë¬ë©ìì§ì ë§ì RUSAGE_ê´ë ¨ ìë¬ ë©ìì§ê° ë°ìí©ëë¤.
- 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', 무ìì´ ì못ë ê±´ê°ì?
- PHP를 ì ê·¸ë ì´ë íê³ ì¶ìµëë¤. íì¬ PHP ì¤ì¹ë¥¼ ìí´ ì¬ì©ëìë ./configure ì¤í ìµì ì ì´ëì ë°ê²¬í ì ììµëê¹?
- GDë¼ì´ë¸ë¬ë¦¬ì ì°ëíì¬ PHP를 ë¹ëíë ¤ íë©´ ì´ìí ì»´íì¼ ìë¬ë¥¼ ë³´ì´ê±°ë ì¤íì¤ ì¸ê·¸ë¨¼í ì´ì í´í¸(segfault)를 ë°ììíµëë¤.
- 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
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
-
language-parser.tab.c파일을 컴파일할때, yytname undeclared라는 에러메시지를 보여주네요.
-
Bison 을 업그레이드할필요가 있습니다. » https://www.gnu.org/software/bison/bison.html에서 최신버전을 받을수 있을겁니다.
-
make명령을 실행시킬때, 처음엔 잘나가다가 마지막에서 프로그램을 링크하려고 할때 특정 파일을 찾지 못한다고 하며 종료되어 버립니다.
-
make의 구버전 중 일부는 functions 디렉토리안에 functions 디렉토리에 들어있는 파일을 정확하게 옮겨놓지 못합니다. cp *.o functions 명령을 실행하고 나서 make명령을 재실행시켜보세요. 이래도 똑같은 증상을 보이면, GNU make를 최신버전으로 업그레이드하세요
-
PHP를 링크할때, 엄청나게 많은 수의 undefined reference 에러메시지를 뿌려줍니다.
-
링크 관련 줄을 보고 정확하게 라이브러리가 설정되었는지 확인하기 바랍니다. 보통 '-ldl'이라는 옵션을 빠뜨리거나, 데이터베이스 지원을 위한 라이브러리를 빠뜨린 경우가 대부분입니다.
아파치 1.2.x에 설치한다면, 설정 파일의 EXTRA_LIBS에 적절한 정보를 추가하여 아파치 설정 스크립트를 다시 실행하셨습니까? 제사한 정보는 설치 챕터를 참고하십시오.
어떤분들의 보고에 따르면 아파치와 같이 설치할때에는 libphp4.a파일 다음에 '-ldl'옵션을 추가해야한다고 합니다.
-
아파치 1.3 버전과 같이 설치하는 방법을 잘 모르겠습니다.
-
매우 쉽습니다. 다음 단계를 차근차근 따라해보세요.
- » https://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파일을 참고하세요.
-
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)를 일으킬만한 설정을 해보거나 다른 방법으로 이 파일이 실제로 적용되는 파일인지 확인할수 있습니다.
-
--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
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
my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install
my $CFG_LIBEXECDIR = '/usr/lib/apache'; # substituted via APACI install
-
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
-
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) 지원이 된다는것입니다.
-
PHP를 업그레이드 하고 싶습니다. 현재 PHP 설치를 위해 사용되었던 ./configure 실행 옵션을 어디서 발견할수 있습니까?
-
현재 PHP설치 디렉토리의 config.nice 파일이나 다음스크립트를 실행시키면 확인할수 있습니다.
<?php phpinfo(); ?>
-
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.