21.2.2.2. 정적 라이브러리 링크 및 uORB 헤더 의존성 결합

21.2.2.2. 정적 라이브러리 링크 및 uORB 헤더 의존성 결합

px4_add_module() 매크로가 단일 C++ 소스 파일들을 하나의 덩어리로 묶어내는 역할을 충실히 수행하더라도, 픽스호크 펌웨어와 같은 방대한 아키텍처에서는 결코 모듈 혼자서 무인기를 날게 할 수 없다.

수학적 쿼터니언(Quaternion) 연산을 위해서는 코어 Math 라이브러리를 끌고 들어와야 하고, 센서 값을 읽거나 모터 명령을 내리려면 PX4의 대동맥인 uORB(Micro Object Request Broker) 퍼블리시/서브스크라이브 시스템과 피를 섞어야만 한다.

이러한 모듈 간의 유기적인 결합은 CMake 단계에서 명확한 **의존성 링킹(Dependency Linking)**을 통해 스크립팅되어야 하며, 특히 uORB 메시지와의 결합은 단순한 라이브러리 링크 이상의 정교한 전처리 타이밍(Pre-processing Timing)을 요구한다.

1. 보이지 않는 코어 라이브러리 자동 링킹(Auto-linking)

다행스럽게도 px4_add_module() 매크로는 개발자의 노고를 덜어주기 위해 가장 필수적인 뼈대 라이브러리들을 백그라운드에서 자동으로 링크시켜 준다.

  • OS/하드웨어 추상화 계층(HAL): NuttX RTOS API, POSIX 스레드(pthread), 디바이스 드라이버 기본 클래스들은 매크로가 타겟 платфор을 인식하여 알아서 연결한다.
  • PX4 파라미터(Param) 시스템: GCS와 설정값을 주고받는 매크로(DEFINE_PARAMETERS 등)를 지원하는 라이브러리 역시 기본 탑재된다.
  • Math 라이브러리 (Matrix): 행렬이나 벡터 연산을 위한 matrix 헤더 역시 기본 포함 경로(Include Path)에 들어가 있어, 코드에서 #include <matrix/math.hpp> 만 선언하면 링커 에러 없이 부드럽게 넘어간다.

따라서 여러분은 이런 필수 코어 라이브러리를 여러분의 CMakeLists.txt에 일일이 target_link_libraries로 적어주는 수고를 하지 않아도 된다.

2. 명시적 의존성이 필요한 영역: uORB 시스템

하지만 모든 것이 자동인 것은 아니다. PX4 생태계에서 커스텀 모듈이 다른 모듈과 대화하기 위해 절대적으로 사용하는 통신망인 uORB(Micro Object Request Broker) 메시지 시스템과 엮일 때는, CMake 스크립트에 반드시 명시적인 서명(Signature)을 갈겨주어야 한다.

만약 여러분의 C++ 코드 안에 단 한 줄이라도 다음과 같이 uORB 헤더 파일을 포함하는 구문이 있다면,

// 내 모듈이 차량 상태 파라미터를 구독하려 할 때
#include <uORB/topics/vehicle_status.h>

여러분의 CMakeLists.txt 안의 px4_add_module() 속성에는 다음과 같은 블록이 무조건, 절대적으로, 누락 없이 들어가야만 한다.

px4_add_module(
    # ...생략...
    DEPENDS
        uORB_msgs
)

DEPENDS uORB_msgs 단 한 줄이 누락되었을 때 발생하는 기괴한 컴파일러 에러들의 향연과, 왜 이 짧은 단어가 그토록 막강한 ’순서 통제력’을 가지는지에 대한 원리는 다음 장(21.2.2.2.1)에서 속 시원하게 분해해 본다. 이 타이밍의 마법을 이해하게 되면 병렬 컴파일(Parallel Compilation) 시스템이 가지는 Race Condition의 본질을 깨닫게 될 것이다.