# Hướng dẫn Build bằng CMake Hướng dẫn chi tiết để build project `pnkx_nav_core` sử dụng CMake standalone (không cần Catkin workspace). ## Mục lục 1. [Yêu cầu hệ thống](#yêu-cầu-hệ-thống) 2. [Cài đặt Dependencies](#cài-đặt-dependencies) 3. [Build Project](#build-project) 4. [Các tùy chọn Build](#các-tùy-chọn-build) 5. [Install](#install) 6. [Sử dụng trong project khác](#sử-dụng-trong-project-khác) 7. [Troubleshooting](#troubleshooting) --- ## Yêu cầu hệ thống ### Hệ điều hành - Linux (Ubuntu 18.04+ hoặc tương đương) ### Compiler - **GCC**: phiên bản 7.0 trở lên (hỗ trợ C++17) - **Clang**: phiên bản 5.0 trở lên ### CMake - **CMake**: phiên bản 3.10 trở lên Kiểm tra phiên bản: ```bash cmake --version g++ --version ``` --- ## Cài đặt Dependencies ### Linux (Ubuntu/Debian) ```bash # Cập nhật package list sudo apt-get update # Cài đặt CMake và build tools sudo apt-get install -y cmake build-essential # Cài đặt các thư viện cần thiết sudo apt-get install -y \ libboost-all-dev \ libeigen3-dev \ libyaml-cpp-dev \ libpcl-dev \ libgoogle-glog-dev # Optional: Cài đặt Google Test (nếu muốn build tests) sudo apt-get install -y libgtest-dev ``` **Lưu ý:** Hướng dẫn này dành cho hệ thống Linux. Nếu sử dụng các distro khác (CentOS, Fedora, Arch, etc.), vui lòng cài đặt các packages tương ứng bằng package manager của distro đó. --- ## Build Project ### Bước 1: Clone repository ```bash git clone https://git.pnkr.asia/HiepLM/pnkx_nav_core.git cd pnkx_nav_core git submodule init git submodule update ``` ### Bước 2: Tạo thư mục build ```bash mkdir build cd build ``` ### Bước 3: Cấu hình với CMake ```bash # Cấu hình cơ bản (Release mode) cmake .. # Hoặc chỉ định build type rõ ràng cmake -DCMAKE_BUILD_TYPE=Release .. # Hoặc Debug mode (để debug) cmake -DCMAKE_BUILD_TYPE=Debug .. ``` ### Bước 4: Build ```bash # Build tất cả targets make # Hoặc build với nhiều cores (nhanh hơn) make -j$(nproc) ``` ### Bước 5: Kiểm tra build thành công ```bash # Kiểm tra các thư viện đã được build ls -la lib/ # Kiểm tra các executable (nếu có) ls -la bin/ ``` --- ## Các tùy chọn Build ### Build Type ```bash # Release mode (mặc định) - tối ưu hóa cmake -DCMAKE_BUILD_TYPE=Release .. # Debug mode - với debug symbols cmake -DCMAKE_BUILD_TYPE=Debug .. # RelWithDebInfo - Release với debug info cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .. # MinSizeRel - Tối ưu kích thước cmake -DCMAKE_BUILD_TYPE=MinSizeRel .. ``` ### Build chỉ một target cụ thể ```bash # Build chỉ một library make robot_cpp_node_handle # Build chỉ move_base make move_base # Build chỉ C API make navigation_c_api ``` ### Các tùy chọn CMake khác ```bash # Tắt warnings (đã được cấu hình sẵn trong CMakeLists.txt) cmake -DCMAKE_CXX_FLAGS="-w" .. # Chỉ định compiler cmake -DCMAKE_CXX_COMPILER=g++-9 .. # Chỉ định install prefix cmake -DCMAKE_INSTALL_PREFIX=/usr/local .. # Build tests (nếu có) cmake -DBUILD_TESTS=ON .. ``` --- ## Install Sau khi build thành công, bạn có thể install các thư viện và headers vào hệ thống: ```bash # Install vào thư mục mặc định (/usr/local) sudo make install # Hoặc install vào thư mục tùy chỉnh cmake -DCMAKE_INSTALL_PREFIX=/opt/pnkx_nav_core .. make install ``` Cấu trúc sau khi install: ``` /usr/local/ ├── include/ │ ├── robot/ │ ├── nav_core2/ │ ├── mkt_algorithm/ │ └── ... ├── lib/ │ ├── librobot_cpp_node_handle.so │ ├── libmove_base.so │ └── ... └── lib/cmake/ ├── robot_cpp/ ├── move_base/ └── ... ``` --- ## Sử dụng trong project khác ### Sử dụng với CMake Sau khi install, bạn có thể sử dụng trong CMakeLists.txt của project khác: ```cmake cmake_minimum_required(VERSION 3.10) project(my_project) # Tìm các packages find_package(robot_cpp REQUIRED) find_package(move_base REQUIRED) find_package(navigation_c_api REQUIRED) # Link libraries add_executable(my_app main.cpp) target_link_libraries(my_app PRIVATE robot_cpp move_base navigation_c_api ) ``` ### Sử dụng C API (cho .NET/C#) Xem hướng dẫn chi tiết trong `examples/README.md` và `examples/QUICK_START.md`. Tóm tắt: ```bash # Copy shared library cp build/src/APIs/c_api/libnavigation_c_api.so /path/to/your/project/ # Sử dụng trong C# [DllImport("libnavigation_c_api.so")] public static extern IntPtr create_navigation(); ``` --- ## Troubleshooting ### Lỗi: "Could not find Boost" ```bash # Kiểm tra Boost đã được cài đặt dpkg -l | grep libboost # Cài đặt lại nếu thiếu sudo apt-get install libboost-all-dev ``` ### Lỗi: "Could not find Eigen3" ```bash # Cài đặt Eigen3 sudo apt-get install libeigen3-dev # Hoặc chỉ định đường dẫn cmake -DEigen3_DIR=/usr/include/eigen3 .. ``` ### Lỗi: "Could not find yaml-cpp" ```bash # Cài đặt yaml-cpp sudo apt-get install libyaml-cpp-dev ``` ### Lỗi: "undefined reference" Đảm bảo tất cả dependencies đã được build theo đúng thứ tự: 1. Core libraries (tf3, robot_time, xmlrpcpp, robot_cpp) 2. Geometry và messages (geometry2, common_msgs) 3. Navigation cores (nav_core, nav_core2) 4. Algorithms (score_algorithm, mkt_algorithm) 5. Main packages (move_base) Build lại từ đầu: ```bash cd build rm -rf * cmake .. make -j$(nproc) ``` ### Lỗi: "Permission denied" khi install ```bash # Sử dụng sudo cho system-wide install sudo make install # Hoặc install vào user directory cmake -DCMAKE_INSTALL_PREFIX=$HOME/local .. make install ``` ### Build chậm ```bash # Sử dụng nhiều cores make -j$(nproc) # Chỉ build target cần thiết make robot_cpp_node_handle # Thay vì make all ``` ### Clean build ```bash # Xóa toàn bộ build directory cd build rm -rf * # Hoặc xóa chỉ các file object make clean ``` --- ## Cấu trúc Build Output Sau khi build, cấu trúc thư mục `build/` sẽ như sau: ``` build/ ├── CMakeCache.txt ├── CMakeFiles/ ├── cmake_install.cmake ├── Makefile ├── lib/ │ ├── librobot_cpp_console.so │ ├── librobot_cpp_node_handle.so │ ├── libmove_base.so │ ├── libnavigation_c_api.so │ └── ... ├── src/ │ ├── Libraries/ │ │ ├── robot_cpp/ │ │ └── ... │ ├── Navigations/ │ │ └── ... │ └── Algorithms/ │ └── ... └── bin/ # (nếu có executables) ``` --- ## Environment Variables Một số biến môi trường hữu ích: ```bash # Chỉ định config directory cho NodeHandle export PNKX_NAV_CORE_CONFIG_DIR=/path/to/config # Chỉ định workspace directory export PNKX_NAV_CORE_DIR=/path/to/pnkx_nav_core # LD_LIBRARY_PATH (nếu không install) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/pnkx_nav_core/build/lib ``` --- ## Quick Reference ### Build nhanh (một lệnh) ```bash mkdir -p build && cd build && cmake .. && make -j$(nproc) ``` ### Build và Install ```bash mkdir -p build && cd build && cmake .. && make -j$(nproc) && sudo make install ``` ### Rebuild từ đầu ```bash rm -rf build && mkdir build && cd build && cmake .. && make -j$(nproc) ``` --- ## Liên kết hữu ích - [CMake Documentation](https://cmake.org/documentation/) - [C++17 Reference](https://en.cppreference.com/w/cpp/17) - [Examples](./examples/README.md) - [Catkin Build Guide](./CATKIN_BUILD_README.md) --- ## Ghi chú - Project này sử dụng **C++17** standard - Warnings đã được tắt trong build configuration (`-w` flag) - Tất cả libraries được build dưới dạng **shared libraries** (.so) - Build type mặc định là **Release** với optimization `-O3`