Chat gpt 와 함께 OSRM 빌드해보기

2024. 11. 18. 23:31프로그래밍/GIS

728x90

오늘은 미뤄왔던 OSRM 빌드하기를 시도해보기로 했습니다.
참고로 OSRM 은 'Open Source Routing Machine' 의 약자입니다.


이렇게 물어 봤습니다.

다음 사이트에 있는 https://github.com/Project-OSRM/osrm-backend 에서 소스를 다운받아서 msys2 환경에서 빌드를 완성하는 방법을 알려 주세요

msys3 를 다운로드 받씁니다.
https://www.msys2.org/


설치를 해주고 패키지를 다음과 같이 업데이트 해 줍니다.
pacman -Syu

 

필수 패키지를 설치 해줘야 한답니다.

pacman -S git make gcc cmake \
mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake \
mingw-w64-x86_64-boost mingw-w64-x86_64-protobuf \
mingw-w64-x86_64-libuv mingw-w64-x86_64-zlib

 

1.5기가 정도 되는데???

그런다음, 소스를 다운로드 받습니다.

 

git clone https://github.com/Project-OSRM/osrm-backend.git

 

GitHub - Project-OSRM/osrm-backend: Open Source Routing Machine - C++ backend

Open Source Routing Machine - C++ backend. Contribute to Project-OSRM/osrm-backend development by creating an account on GitHub.

github.com

 

 

서브 모듈을 초기화 해 줍니다. 서브 모듈이 많이 붙어 있나 봅니다.

git submodule update --init --recursive

 

서브모듈이 뭔지 나름 삽질을 한 결과는 예전 블로그에 있습니다.

https://blog.naver.com/tommybee/220840604103?trackingCode=blog_bloghome_searchlist

 

Git 서브모듈을 사용한 프로젝트 분류

내가 만든 라이브러리나 소스코드를 github에 넣어두고 필요할 때 사용하려 한다면 당연히  github에 ...

blog.naver.com

 

빌드 준비과정

build 라는 디렉토리를 만들고, 이 디렉토리에서 빌드를 하도록 해 줍니다.

mkdir build

cd build

 

CMake 로 환경설정 해주기

MinGW gcc 로 빌드 해주기 때문에 다음과 같이 해 주는 것으로...

 

cmake -G "MSYS Makefiles" \
-DCMAKE_BUILD_TYPE=Release \
-DBOOST_INCLUDEDIR=/mingw64/include/boost \
-DBOOST_LIBRARYDIR=/mingw64/lib ..

 

TBB 설치

다음 오류에 따른 것입니다.

" Could NOT find TBB (missing: TBB_DIR)"

 

pacman -S mingw-w64-x86_64-tbb

 

설치 확인은 다음 명령어로 합니다.

ls /mingw64/lib | grep tbb 

 

빌드 파일 만들기

cmake -G "MSYS Makefiles" \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_SYSTEM_NAME=Windows \
  -DBOOST_INCLUDEDIR=/mingw64/include/boost \
  -DBOOST_LIBRARYDIR=/mingw64/lib \
  -DTBB_DIR=/mingw64/lib/cmake/TBB \
  ..

 

Lua 설치

다음 오류에 의해서 설치 해 줍니다.

"Could NOT find Lua (missing: LUA_LIBRARIES LUA_INCLUDE_DIR)"

 

설치를 확인 해 줍시다.

ls /mingw64/lib | grep lua

ls /mingw64/include | grep lua

 

 

다시 빌드 파일 만들기 - CMake

cmake -G "MSYS Makefiles" \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_SYSTEM_NAME=Windows \
  -DBOOST_INCLUDEDIR=/mingw64/include/boost \
  -DBOOST_LIBRARYDIR=/mingw64/lib \
  -DTBB_DIR=/mingw64/lib/cmake/TBB \
  -DLUA_INCLUDE_DIR=/mingw64/include \
  -DLUA_LIBRARIES=/mingw64/lib/liblua.a \
  ..

 

TBB 경로 명시하기

다음 오류에 의해서 진행 합니다.

"TBB_INCLUDE_DIR-NOTFOUND"

 

주의 메시지 없애기

다음 주의 메시지 때문에 진행 합니다.

"  Manually-specified variables were not used by the project:
    TBB_LIBRARY "

 

cmake -G "MSYS Makefiles" \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_SYSTEM_NAME=Windows \
  -DBOOST_INCLUDEDIR=/mingw64/include/boost \
  -DBOOST_LIBRARYDIR=/mingw64/lib \
  -DTBB_DIR=/mingw64/lib/cmake/TBB \
  -DLUA_INCLUDE_DIR=/mingw64/include \
  -DLUA_LIBRARIES=/mingw64/lib/liblua.a \
  -DTBB_INCLUDE_DIR=/mingw64/include \
  ..

 

최종 빌드 파일을 만들기 위한 명령은 다음과 같습니다.

cmake -G "MSYS Makefiles" \
  -DDOXYGEN_EXECUTABLE=OFF \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_SYSTEM_NAME=Windows \
  -DBOOST_INCLUDEDIR=/mingw64/include/boost \
  -DBOOST_LIBRARYDIR=/mingw64/lib \
  -DTBB_DIR=/mingw64/lib/cmake/TBB \
  -DLUA_INCLUDE_DIR=/mingw64/include \
  -DLUA_LIBRARIES=/mingw64/lib/liblua.a \
  -DTBB_INCLUDE_DIR=/mingw64/include \
  ..

 

빌드를 실행 해 줍니다.

make -j$(nproc)

 

오류 몇가지

다음은 오류 몇가지를 넘어야 합니다. 그런데 이렇게 넘어가는 것이 맞는 지는 모르겠으나, 그냥 빌드 오류 안나게 하고 틀린 답이 아니라고 생각해서 이렇게 적어 봅니다.

오류 1.

In file included from C:/DEV/SDK/msys64/home/User/osrm-backend/include/engine/datafacade/shared_memory_allocator.hpp:7,
                 from C:/DEV/SDK/msys64/home/User/osrm-backend/src/engine/datafacade/shared_memory_allocator.cpp:1:
C:/DEV/SDK/msys64/home/User/osrm-backend/include/storage/shared_memory.hpp: In constructor 'osrm::storage::SharedMemory::SharedMemory(const std::filesystem::__cxx11::path&, int, uint64_t)':
C:/DEV/SDK/msys64/home/User/osrm-backend/include/storage/shared_memory.hpp:205:47: error: unused parameter 'lock_file' [-Werror=unused-parameter]
  205 |     SharedMemory(const std::filesystem::path &lock_file, const int id, const uint64_t size = 0)
      |                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~
At top level:
cc1plus.exe: note: unrecognized command-line option '-Wno-ambiguous-reversed-operator' may have been intended to silence earlier diagnostics
cc1plus.exe: note: unrecognized command-line option '-Wno-deprecated-comma-subscript' may have been intended to silence earlier diagnostics
cc1plus.exe: all warnings being treated as errors
make[2]: *** [CMakeFiles/ENGINE.dir/build.make:121: CMakeFiles/ENGINE.dir/src/engine/datafacade/shared_memory_allocator.cpp.obj] Error 1
make[1]: *** [CMakeFiles/Makefile2:501: CMakeFiles/ENGINE.dir/all] Error 2

 

"가장 간단한 해결책은 (void)lock_file;을 추가해 매개변수가 사용되지 않음을 명시하거나, -Wno-unused-parameter 플래그를 사용해 경고를 무시하는 것입니다.
프로젝트의 정책에 따라 매개변수의 용도를 결정하고 위 방법 중 하나를 적용하면 됩니다."

라고 하셨습니다. (Chat GPT). 선생님께서...

 

그래서 아래 코드 정도로 마무리 했습니다.

SharedMemory(const std::filesystem::path &lock_file, const int id, const uint64_t size = 0)
{
	(void)lock_file; // 사용되지 않는 매개변수임을 명시적으로 처리
     ....

 

오류 2.

In function 'memcpy',
    inlined from 'move_assign' at C:/DEV/SDK/msys64/mingw64/include/boost/function/function_template.hpp:1008:24,
    inlined from 'swap' at C:/DEV/SDK/msys64/mingw64/include/boost/function/function_template.hpp:873:22,
    inlined from 'operator=.isra' at C:/DEV/SDK/msys64/mingw64/include/boost/function/function_template.hpp:1125:22:
C:/DEV/SDK/msys64/mingw64/include/string.h:206:32: error: 'MEM <unsigned char[24]> [(char * {ref-all})&D.8785 + 8B]' is used uninitialized [-Werror=uninitialized]
  206 |   return __builtin___memcpy_chk(__dst, __src, __n, __mingw_bos(__dst, 0));
      |                                ^
C:/DEV/SDK/msys64/mingw64/include/boost/function/function_template.hpp: In member function 'operator=.isra':
C:/DEV/SDK/msys64/mingw64/include/boost/function/function_template.hpp:1125:5: note: '<anonymous>' declared here
 1125 |     self_type(f).swap(*this);
      |     ^
lto1.exe: all warnings being treated as errors
make[3]: *** [C:\DEV\SDK\msys64\tmp\ccJCah8Z.mk:113: C:\DEV\SDK\msys64\tmp\ccnjjMJq.ltrans37.ltrans.o] Error 1
lto-wrapper.exe: fatal error: make returned 2 exit status
compilation terminated.
C:/DEV/SDK/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: error: lto-wrapper failed
collect2.exe: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/osrm-routed.dir/build.make:166: osrm-routed.exe] Error 1
make[1]: *** [CMakeFiles/Makefile2:565: CMakeFiles/osrm-routed.dir/all] Error 2
make: *** [Makefile:136: all] Error 2

초기화 되지 않은 메모리 인데...컴파일러 옵션이 있기는 한데.. 뭐 그렇게 하기보다는 아래 코드를 넣어줘도 될 것 같아서 그리 하였습니다.

memset(f.functor.data, 0x00, sizeof(functor.data));  
std::memcpy(this->functor.data, f.functor.data, sizeof(this->functor.data));

 

빌드 완료

다음은 빌드가 완료 된 모습입니다.

 

실행 및 테스트

드디어, 실행 하고 테스트 해 볼 시간이네요..

한국 OSM 데이터 다운로드:
아래 사이트에서
https://download.geofabrik.de/asia/south-korea.html
다운로드 합니다.

 

Geofabrik Download Server

 

download.geofabrik.de

 

아래처럼 해놓고

다음은 순서 입니다.


1.OSRM 데이터 추출 (OSM 파일로부터) 다운로드한 .osm.pbf 파일을 OSRM에 맞는 형식으로 변환

osrm-extract -p profiles/car.lua /path/to/your/map.osm.pbf

 

실제 실행 명령과 출력입니다 - 오류 났네요

$ ./osrm-extract.exe -p ../profiles/car.lua south-korea-latest.osm.pbf
[2024-11-18T13:56:58.477505000] [info] Parsed 0 location-dependent features with 0 GeoJSON polygons
[2024-11-18T13:56:58.478248300] [info] Using script ../profiles/car.lua
[2024-11-18T13:56:58.478484700] [info] Input file: south-korea-latest.osm.pbf
[2024-11-18T13:56:58.478704800] [info] Profile: car.lua
[2024-11-18T13:56:58.478954800] [info] Threads: 12
[2024-11-18T13:56:58.480483200] [info] Parsing in progress..
[2024-11-18T13:56:58.481422400] [info] input file generated by osmium/1.14.0
[2024-11-18T13:56:58.482283800] [info] timestamp: 2024-11-17T21:20:45Z
[2024-11-18T13:56:58.488182500] [info] Using profile api version 4
[2024-11-18T13:56:58.488961100] [info] Found 3 turn restriction tags:
[2024-11-18T13:56:58.489520700] [info]   motor_vehicle
[2024-11-18T13:56:58.489837600] [info]   motorcar
[2024-11-18T13:56:58.490047800] [info]   vehicle
[2024-11-18T13:56:58.490262900] [info] Parse relations ...
[2024-11-18T13:56:58.968117500] [info] Parse ways and nodes ...
[2024-11-18T13:56:58.975663100] [info] Using profile api version 4
[2024-11-18T13:56:58.980441600] [info] Using profile api version 4
[2024-11-18T13:56:58.986474700] [info] Using profile api version 4
[2024-11-18T13:56:58.991534900] [info] Using profile api version 4
[2024-11-18T13:56:58.996505400] [info] Using profile api version 4
[2024-11-18T13:56:59.001536000] [info] Using profile api version 4
[2024-11-18T13:56:59.006254200] [info] Using profile api version 4
[2024-11-18T13:56:59.011150200] [info] Using profile api version 4
[2024-11-18T13:56:59.016037200] [info] Using profile api version 4
[2024-11-18T13:56:59.021003100] [info] Using profile api version 4
[2024-11-18T13:56:59.026223900] [info] Using profile api version 4
Segmentation fault

 

위 오류는 어려가지 이유가 있을 것 같아서 다음 사이트에서 조금 작은 크기를 다운 받아서 사용해 봅니다

https://tiles.osm.kr/download/

 

Index of /download/

 

tiles.osm.kr

 

 ./osrm-extract.exe -p ../profiles/car.lua seoul-non-military.osm.pbf

위의 명령어도 똑 같이 오류가 발생 합니다.

 

gdb 디버깅

우선 gdb를 설치 해 줍니다.

$ pacman -S gdb
$ gdb --version
GNU gdb (GDB) 14.2
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

 

디버깅 진행

$ gdb ./osrm-extract
$ (gdb) run -p ../profiles/car.lua south-korea-latest.osm.pbf
>> 중단점 설정
$ (gdb) break function_name
>> 코드의 특정 줄에서 중단
$ (gdb) break filename.cpp:line_number
>>프로그램이 중단되면, 
>>next, step, continue와 같은 명령어로 프로그램 실행을 계속할 수 있습니다. 예를 들어:
>>next: 현재 함수의 다음 줄로 이동
>>step: 함수 내로 들어가서 실행
>>continue: 중단점까지 계속 실행
>> 나가기
$ (gdb) quit

 

오류 확인 부분

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00007ff676ffee07 in boost::detail::function::function_obj_invoker<boost::spirit::qi::detail::parser_binder<boost::spirit::qi::reference<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, unsigned int (), boost::spirit::locals<unsigned int, unsigned int, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::spirit::unused_type, boost::spirit::unused_type> const>, mpl_::bool_<false> >, bool, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, boost::spirit::context<boost::fusion::cons<unsigned int&, boost::fusion::nil_>, boost::fusion::vector<> >&, boost::spirit::unused_type const&>::invoke(boost::detail::function::function_buffer&, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, boost::spirit::context<boost::fusion::cons<unsigned int&, boost::fusion::nil_>, boost::fusion::vector<> >&, boost::spirit::unused_type const&) ()

 

==> gdb에서 발생한 Segmentation fault 메시지는 boost::spirit::qi::parser_binder와 관련된 Boost Spirit 라이브러리의 일부 코드에서 오류가 발생했음을 나타냅니다. 오류가 발생한 부분은 Boost Spirit의 파싱 과정 중에 문제가 발생한 것으로 보이며, 이는 메모리 접근 오류로 이어질 수 있습니다.

 

디버그 모드로 다시 빌드 해보도록 합니다.

cmake -G "MSYS Makefiles" \
  -DDOXYGEN_EXECUTABLE=OFF \
  -DCMAKE_BUILD_TYPE=Debug \
  -DCMAKE_SYSTEM_NAME=Windows \
  -DBOOST_INCLUDEDIR=/mingw64/include/boost \
  -DBOOST_LIBRARYDIR=/mingw64/lib \
  -DTBB_DIR=/mingw64/lib/cmake/TBB \
  -DLUA_INCLUDE_DIR=/mingw64/include \
  -DLUA_LIBRARIES=/mingw64/lib/liblua.a \
  -DTBB_INCLUDE_DIR=/mingw64/include \
  ..

 

make -j$(nproc)

위의 경우 file is too big 오류가 발생 했습니다. 그래서 다음과 같이 선생님이 하라는 대로 했습니다.

cmake -G "MSYS Makefiles" \
  -DCMAKE_CXX_FLAGS="-fno-lto -flarge-source-files -fno-inline" \
  -DDOXYGEN_EXECUTABLE=OFF \
  -DCMAKE_BUILD_TYPE=Debug \
  -DCMAKE_SYSTEM_NAME=Windows \
  -DBOOST_INCLUDEDIR=/mingw64/include/boost \
  -DBOOST_LIBRARYDIR=/mingw64/lib \
  -DTBB_DIR=/mingw64/lib/cmake/TBB \
  -DLUA_INCLUDE_DIR=/mingw64/include \
  -DLUA_LIBRARIES=/mingw64/lib/liblua.a \
  -DTBB_INCLUDE_DIR=/mingw64/include \
  ..

 

- 이 오류는 GCC의 최적화와 관련된 문제일 수 있습니다. -flto(Link Time Optimization)를 비활성화하거나 다른 최적화 옵션을 조정해 보세요.
- 오류 메시지에서 언급된 -flarge-source-files 플래그를 사용하면 더 큰 소스 파일을 처리할 수 있습니다. 이 플래그를 추가하여 컴파일 시간을 늘리고 메모리 사용량을 증가시키면, 더 큰 파일도 처리할 수 있게 됩니다.
- 또한 -fno-inline 플래그를 사용하여 인라인 최적화를 비활성화하면 객체 파일 크기가 줄어들 수 있습니다.

 

위와 같이 처리 하였으나 여전히 오류가 계속 됨...

 

 

2.OSRM 데이터 압축 및 최적화 (OSM 데이터를 빠르게 사용 가능하도록 준비) 추출 후 osrm-contract 명령을 사용하여 압축 및 최적화를 진행.

osrm-contract /path/to/your/map.osrm



이 과정은 상당히 시간이 걸릴 수 있습니다. 완료되면 *.osrm, *.osm.pbf, *.osrm 등 여러 파일들이 생성됩니다.

728x90