ProtoBuf Link Error

Programming 2024. 7. 20. 16:14

또 이직을 하면서 이번에는 멀티 플랫폼에서 빌드를 하게 된다. 상황에 따라서 3가지 환경에서 빌드한다.

  • 맥북에서 원격으로 Raspberry Pi를 SSH로 연결 : 실환경
  • 맥북에서 MacOS Native : 실환경 없을 때 빌드 환경
  • 리눅스에서 크로스 컴파일 : CI를 위한 테스트 환경

그러다 보니 대부분 잘 돌아가는 데 희한한 경우를 만날 때가 있다.

이번에는 Linux, RB Pi에서는 잘 되는데, 맥에서만 안 된다.

에러는 갑자기 Link Error 가 난다.


Undefined symbols for architecture arm64:  
  "void absl::lts\_20240116::log\_internal::LogMessage::CopyToEncodedBuffer<(absl::lts\_20240116::log\_internal::LogMessage::StringType)0>(std::\_\_1::basic\_string\_view<char, std::\_\_1::char\_traits<char>>)", referenced from:  
      absl::lts\_20240116::log\_internal::LogMessage& absl::lts\_20240116::log\_internal::LogMessage::operator<<<19>(char const (&) \[19\]) in libproto.a\[2\](cw2.pb.cc.o)  
  "absl::lts\_20240116::log\_internal::LogMessage& absl::lts\_20240116::log\_internal::LogMessage::operator<<<unsigned long, 0>(unsigned long const&)", referenced from:  
      absl::lts\_20240116::log\_internal::LogMessage::operator<<(unsigned long) in libproto.a\[2\](cw2.pb.cc.o)

....

find_package를 CONFIG Mode로 돌렸더니, 이번에는 다른 에러가 난다. 이런 경우 대부분 버전이 안 맞는 거다.

MODULE 모드와 다른 에러가 나면, 설치된 Package와 Cmake에 설치된 파일이 불일치된 경우가 많다.

어쨌든 결론만 요약하면, 버전에 따라 Link될 라이브러리를 추가한다.
근원적인 다른 방법으로는 protobuf_generate_cpp 를 버전에 따라서 protobuf_generate로 교체하는 것인데,
뭐 굳이 필요한 게 아니라 그냥 넘어간다. 나중에 CMake의 버전이 올라가면 그 때 수정해야 겠다. 그 전에 하면 뭔가 일이 많아지니..


if (Protobuf_VERSION VERSION_GREATER_EQUAL 4)
    find_package(absl REQUIRED)

    target_link_libraries (${PROJECT_NAME}
            PUBLIC
            absl::log_internal_check_op
            ${PROTOBUF_LIBRARIES}
    )
    target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})
else()
    target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})
endif ()

WRITTEN BY
HanDDol
여행이란 건 말이지. 첫 걸음을 내딜 때는 모든 게 낯설고.. 그리고 점점 더 낯선 세상에 익숙해지면서 세상의 모든 곳이 고향처럼 느껴진다. 고향으로 돌아오는 여행의 마지막 걸음에는 나의 고향이 더 이상 익숙한 곳이 아닌 낯선 곳임을 알게 된다.

,