2.15.3. Perl DBI/DBD 인터페이스를 사용할 때의 문제점
만약에 Perl이 ../mysql/mysql.so 모듈을 찾을 수 없다면, 문제는 아마도 Perl이 libmysqlclient.so 공유 라이브러리를 가져오지 못했기 때문일 것이다. 여러분은 아래에 열거된 방법 중에 하나를 가지고 이 문제를 해결해야 한다:
DBD::mysql배포판을 컴파일 할 때,perl Makefile.PL대신에perl Makefile.PL -static -config를 사용한다.libmysqlclient.so를 다른 공유 라이브러리가 저장되어 있는 디렉토리에 복사 한다 (/usr/lib또는/lib).DBD::mysql을 컴파일할 때 사용하는-L옵션을 수정해서libmysqlclient.so의 실제 위치를 반영하도록 만든다.- 리눅스에서는,
libmysqlclient.so가 저장되어 있는 디렉토리의 경로 이름을/etc/ld.so.conf파일에 추가 한다. libmysqlclient.so가 저장되어 있는 디렉토리의 경로 이름을LD_RUN_PATH환경 변수에 추가 한다. 어떤 시스템에서는 이것 대신에LD_LIBRARY_PATH를 사용하기도 한다.
만약에 링커가 찾지 못하는 다른 라이브러리가 존재한다면 -L 옵션을 수정할 필요도 있다는 점을 알기 바란다. 예를 들면, 링커가 /lib 에 있고 링크 명령어가 -L/usr/lib /lib를 지정하고 있기 때문에 libc 를 찾는데 실패하면, -L 옵션을 -L/lib 로 변경하거나 또는 -L/lib 를 존재하는 링크 명령어에 추가한다.
DBD::mysql에서 아래와 같은 에러를 보게 되면, 이것은 gcc 를 사용하고 있기 때문일 것이다 (또는 gcc로 컴파일된 구형 바이너리들을 사용하는 것이다):
/usr/bin/perl: can't resolve symbol '__moidd3'
/usr/bin/perl: can't resolve symbol '__divdi3'
mysql.so 라이브러리를 구축할 때 -L/usr/lib/gcc-lib/... –lgcc를 링크 명령어에 추가한다 (여러분이 Perl클라이언트를 컴파일 할 때 mysql.so 에 대해서 make가 만드는 결과를 검사한다). -L 옵션은 시스템에 libgcc.a 가 저장되어 있는 디렉토리의 경로 이름을 지정해 주도록 한다.
이 문제에 대한 다른 원인은 Perl과 MySQL이 모두 gcc로 컴파일 되지 않았다는 것을 의미할 수도 있다. 이와 같은 경우에는, 두 가지 모두를 gcc를 가지고 컴파일해서 불일치 되는 문제를 해결하면 된다.
테스트를 진행하는 동안에 DBD::mysql에서 아래의 에러를 볼 수도 있다:
t/00base............install_driver(mysql) failed:
Can't load '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql:
../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol:
uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169.
이것은 -lz 압축 라이브러리를 링크 라인에 포함시킬 필요가 있음을 의미하는 것이다. 이 문제는 lib/DBD/mysql/Install.pm에서 아래의 라인을 변경하면 해결된다:
$sysliblist .= " -lm";
위의 라인을 아래와 같이 변경한다:
$sysliblist .= " -lm -lz";
이렇게 한 후에는 반드시 make realclean 를 실행하고 설치 과정을 처음부터 다시 진행한다.