Berkeley DB의 “duplicate sort specified but not supported in database” 에러 처리하기
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라이브러리가설치된디렉토리명을 지정하는 것도 잊어선 안 되겠다.