Berkeley DB(이하 BDB) 라이브러리를 이용하여 프로그램을 작성하고 실행하다보면 어떤 컴파일 환경에서는 다음과 같은 에러를 발생하고 실행이 비정상으로 종료되는 경우가 발생하기도 한다.
0000.db: duplicate sort specified but not supported in database
terminate called after throwing an instance of ‘DbException’
what(): Db::open: 부적절한 인수
중지됨 (core dumped)
shell의 locale이 C로 되어 있는 경우에는 “부적절한 인수”라는 표현 대신에 “Invalid argument”로 대체된다.
이런 경우 에러 메시지를 곧이 곧대로 믿으면, 쉽게 해결하지 못하고 크게 헤매게 될 수 있다. 문제의 원인은 아주 간단한 데 있다. 바로 해당 프로그램이 사용하려고 의도한 BDB 라이브러리의 버전과 실제 사용된 BDB 라이브러리의 버전의 불일치로 인해 발생한 것이다. 더욱 의아한 것은 라이브러리는 사용하려고 의도한 버전으로 동일하더라도 헤더 파일이 달라서 발생한다는 것이다.
예를 들어, /usr/include에 기본 BDB 패키지의 헤더 파일인 db.h가 존재하고 /usr/local/include에 개발자가 사용하려는 다른 버전의 db.h가 존재하게 되면 컴파일 옵션을 -I /usr/local/include로 명시하지 않는 이상, /usr/include/db.h가 include된다. 이런 경우, 위에서 적은 것과 동일한 에러가 발생하는 것이다.
Makefile의 CFLAGS 항목에 -I /usr/local/include 또는 -I BDB라이브러리의헤더가설치된디렉토리명 을 추가해주면 된다. 당연히 LDFLAGS 항목에도 -L /usr/local/lib 또는 -L BDB라이브러리가설치된디렉토리명을 지정하는 것도 잊어선 안 되겠다.