또 이직을 하면서 이번에는 멀티 플랫폼에서 빌드를 하게 된다. 상황에 따라서 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
여행이란 건 말이지. 첫 걸음을 내딜 때는 모든 게 낯설고.. 그리고 점점 더 낯선 세상에 익숙해지면서 세상의 모든 곳이 고향처럼 느껴진다. 고향으로 돌아오는 여행의 마지막 걸음에는 나의 고향이 더 이상 익숙한 곳이 아닌 낯선 곳임을 알게 된다.