오늘은 미뤄왔던 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
서브 모듈을 초기화 해 줍니다. 서브 모듈이 많이 붙어 있나 봅니다.
git submodule update --init --recursive
서브모듈이 뭔지 나름 삽질을 한 결과는 예전 블로그에 있습니다.
https://blog.naver.com/tommybee/220840604103?trackingCode=blog_bloghome_searchlist
빌드 준비과정
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
다운로드 합니다.
아래처럼 해놓고
다음은 순서 입니다.
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/
./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 등 여러 파일들이 생성됩니다.
'프로그래밍 > GIS' 카테고리의 다른 글
[실패] OSRM 실행하기 - 오류 해결 (0) | 2024.11.23 |
---|---|
Chat gpt 와 함께 OSRM 빌드해보기 - 디버그모드 (1) | 2024.11.22 |
카카오 맵 API 를 사용한 도형 좌표 표출 (0) | 2024.01.30 |
톰캣 카카오 맵 API 사용하기 (0) | 2024.01.29 |
JMapViewer - 오픈스트리트 지도뷰어 (1) | 2024.01.26 |