문제 발생 이유
다른 컴퓨터에서 Ceres를 빌드하고 만든 C++ 프로젝트를 새로운 컴퓨터에서 사용하려고 했을 때 나타난 에러이다.
해당 에러가 나타나는 이유를 짐작해보자면 아래와 같다.
- Visual Studio 2017은 MSVC (Microsoft Visual C++)를 사용한다.
- Ceres는 이전에 POSIX를 사용해서 만들 수 있었고, 빌드 방법도 POSIX를 사용한다. 물론 시대가 발전하면서 MSVC에서도 빌드가 가능해졌다.
- 2005년부터 MSVC는 POSIX Bessel Function (j0)을 더 이상 사용하지 않기로 했다. Ceres는 이것에 맞춰서, Ceres 내부에 빌드할 때 해당 에러가 나타나면 이를 MSVC에서 호환가능한 방식으로 (_j0) 치환해서 빌드를 진행하라는 커맨드를 넣어놓았다.
- 하지만 우리는 다른 컴퓨터에서 Ceres를 빌드하고, 새 컴퓨터로 가져와서 실행하려 한다. 그러므로 우리는 POSIX Bessel Function을 치환하라는 커맨드가 주입되지 않은 Ceres를 사용하려고 하는 것이다. 이에 MSVC는 변환되지 않은 POSIX Bessel Function을 보았을 때 처리를 할 수 없어서 에러를 띄우는 것이다
(...라고 추정한다)
해결책
POSIX Bessel Function을 치환하라는 커맨드를 넣어주면 된다.
Ceres의 config.h 헤더파일을 찾는다.
나의 경우 include → ceres → internal 에서 찾았다.
Line 46에 CERES_MSVC_USE_UNDERSCORE_PREFIXED_BESSEL_FUNCTIONS를 추가하였다.
말 그대로 Bessel Function 앞에 prefix로 underscore (_)를 넣으라고 한것이다.