홈/Article
Article빌드 노트

react-native-libsodium에서 escape와 .so 관련 오류 해결하기

간단히 오류 해결을 위한 글로, 경어체는 생각하고 작성합니다.감안하고 봐 주세요.이글을 쓰는 이유는 OpenAI, Claude, Gemini에 디테일하게 물어보았으나, 전혀 다른 방법으로 답변을 알려주어서, 삽질을 많이 했습니다. 그래서 삽질 방지용으로 적어봅니다.escape쪽은 어느정도 해결을 해 주려...

라이언 칸 작성 - 2025년 9월 16일7분

간단히 오류 해결을 위한 글로, 경어체는 생각하고 작성합니다.

감안하고 봐 주세요.

이글을 쓰는 이유는 OpenAI, Claude, Gemini에 디테일하게 물어보았으나, 전혀 다른 방법으로 답변을 알려주어서, 삽질을 많이 했습니다. 그래서 삽질 방지용으로 적어봅니다.
escape쪽은 어느정도 해결을 해 주려고 하고, .so 파일에서는 별도 .so파일 구성을 하거나, wsl로 실행을 하라는등 별도 .so 설치하는 쪽으로 답변을 해었습니다.


React Native(RN) 앱을 구성하면서 데이타 필드의 암호화가 필요해서 react-native-libsodium를 사용하기로 했다.

그래서 libsodium을 설치하고 안드로이드로 빌드로 계속해서 오류를 발생시켰다.

이는 그외 관련된 간단히 해결책이나 팁이라 생각되어 적어본다.

현재 설치된 패키지들의 버전이며, 빌드는 윈도우 환경에서 실행하고 있다.

"react": "19.1.0",
"react-i18next": "^15.6.0",
"react-native": "0.80.1",
"react-native-libsodium": "^1.4.0"

CMakeLists escape 오류

> npx react-native run-android
....
> Task :react-native-libsodium:configureCMakeDebug[arm64-v8a] FAILED
C/C++: CMake Warning (dev) in CMakeLists.txt:
C/C++:   No project() command is present.  The top-level CMakeLists.txt file must
C/C++:   contain a literal, direct call to the project() command.  Add a line of
C/C++:   code such as
C/C++:     project(ProjectName)
C/C++:   near the top of the file, but after cmake_minimum_required().
C/C++:   CMake is pretending there is a "project(Project)" command on the first
C/C++:   line.
C/C++: This warning is for project developers.  Use -Wno-dev to suppress it.
C/C++: CMake Error at CMakeLists.txt:34 (add_library):
C/C++:   Syntax error in cmake code when parsing string
C/C++:     D:\App\Release_V1\node_modules/react-native/ReactCommon/jsi/jsi/jsi.cpp
C/C++:   Invalid character escape '\K'.

그래서 node_modules\react-native-libsodium\android\CMakeLists.txt에서 escape를 별도 처리해 줘야 한다.

cmake_minimum_required(VERSION 3.4.1)

project(react_native_libsodium LANGUAGES C CXX)

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Gradle 쪽에서 -DNODE_MODULES_DIR=... 을 넘겨줘야 합니다.
if(NOT DEFINED NODE_MODULES_DIR)
  message(FATAL_ERROR "NODE_MODULES_DIR is not defined. Pass -DNODE_MODULES_DIR=<path to node_modules> from Gradle.")
endif()

# Windows의 '\' 경로를 CMake 내부 표현('/')로 변환
file(TO_CMAKE_PATH "${NODE_MODULES_DIR}" NODE_MODULES_DIR_CMAKE)

# 경로들 정리
set(PROJECT_CPP_DIR "${CMAKE_CURRENT_LIST_DIR}/../cpp")
set(JSI_DIR         "${NODE_MODULES_DIR_CMAKE}/react-native/ReactCommon/jsi")
set(REACT_DIR       "${NODE_MODULES_DIR_CMAKE}/react-native/React")
set(REACT_BASE_DIR  "${NODE_MODULES_DIR_CMAKE}/react-native/React/Base")

# libsodium 빌드 루트
set(LIBSODIUM_BUILD_DIR "${CMAKE_CURRENT_LIST_DIR}/../libsodium/build")

# ABI 별 libsodium 빌드 디렉터리 선택
if(${ANDROID_ABI} STREQUAL "arm64-v8a")
  set(LIBSODIUM_BUILD_DIR "${LIBSODIUM_BUILD_DIR}/libsodium-android-armv8-a+crypto")
elseif(${ANDROID_ABI} STREQUAL "armeabi-v7a")
  set(LIBSODIUM_BUILD_DIR "${LIBSODIUM_BUILD_DIR}/libsodium-android-armv7-a")
elseif(${ANDROID_ABI} STREQUAL "x86")
  set(LIBSODIUM_BUILD_DIR "${LIBSODIUM_BUILD_DIR}/libsodium-android-i686")
else()
  set(LIBSODIUM_BUILD_DIR "${LIBSODIUM_BUILD_DIR}/libsodium-android-westmere")
endif()

# 사전 빌드된 sodium(.so)을 IMPORTED 타깃으로 선언
add_library(sodium SHARED IMPORTED)
set_target_properties(sodium PROPERTIES
  IMPORTED_LOCATION "${LIBSODIUM_BUILD_DIR}/lib/libsodium.so"
  INTERFACE_INCLUDE_DIRECTORIES "${LIBSODIUM_BUILD_DIR}/include"
)

# 우리 모듈 (JSI 브리지)
add_library(libsodium
  SHARED
  "${JSI_DIR}/jsi/jsi.cpp"
  "${PROJECT_CPP_DIR}/react-native-libsodium.cpp"
  "${PROJECT_CPP_DIR}/react-native-libsodium.h"
  "${CMAKE_CURRENT_LIST_DIR}/cpp-adapter.cpp"
)

# 인클루드 경로
target_include_directories(libsodium
  PRIVATE
    "${PROJECT_CPP_DIR}"
    "${JSI_DIR}"
    "${REACT_DIR}"
    "${REACT_BASE_DIR}"
    "${LIBSODIUM_BUILD_DIR}/include"
)

# 링크
target_link_libraries(libsodium PRIVATE sodium)

이렇게 구성하고 다시 빌드하니, 아래처럼 오류가 발생했음..

빌드시 ./gradlew clean 으로 캐시를 없애고 난뒤에 작업해야 한다.

C/C++: CMake Error in CMakeLists.txt: C/C++: Imported target "sodium" includes non-existent path 
C/C++:   "D:/App/Release_V1/node_modules/react-native-libsodium/android/../libsodium/build/libsodium-android-armv8-a+crypto/include" 
C/C++: in its INTERFACE_INCLUDE_DIRECTORIES. Possible reasons include: 
C/C++: * The path was deleted, renamed, or moved to another location. 
C/C++: * An install or uninstall procedure did not complete successfully. 
C/C++: * The installation package was faulty and references files it does not 
C/C++: provide. 
C/C++: CMake Generate step failed. Build files cannot be regenerated correctly.

이런 오류가 발생했다. 이건 libsodium/build/libsodium-android-armv8-a+crypto 를 찾지 못해서 생긴 문제이다

react-native-libsodium에서 escape와 .so 관련 오류 해결하기 이미지 1

node_modules/react-native-libsodium/libsodium/ 의 구조로, 여기서 AI들은 build.sh 를 실행하라고 했다. 당연히 윈도우에서는 .sh 이 실행이 안되니.. 좀더 대화가 들어가면 WSL이나 MSYS2, Git Bash로 빌드 시키는 방향으로 전개 시켰다.

(리눅스나 Mac에서는 build.sh를 실행하면 쉽게 해결이 될수 있다. 하지만 윈도우는 아닐것으로 생각이 된다.)

하지만 그럴 필요가 없이,그냥 build.tgz를 풀어만 주면 된다.

즉, 프리빌트 파일을 아직 전개(extract)하거나 빌드하지 않은 상태라서 CMake가 “없는 경로”라고 실패한 것이다.

이때는 그냥 build.tgz의 압축을 풀어주면 된다. 주의할 것은 윈도우에서 압축을 풀면 build/build로 풀리기는 한데, /build/libsodium-android-armv8-a+crypto/ 이렇게 디렉토리 구성이 되어야 한다.

그럼 빌드시 정상적으로 .so 파일이 생성이 될 것이다.

react-native-libsodium에서 escape와 .so 관련 오류 해결하기 이미지 2

다시 재빌드시 정상적으로 생성된 libsodium.so 파일들..


libsodium을 RN에서 처음 사용해 봐서 삽질을 했는데, 해결하고 보니.. 진짜 별거 아닌거 같네요..ㅎㅎ

하지만, 빌드시 계속 오류를 발생시켜서 많이 헤맸습니다.. ㅡ.ㅜ;

이글을 보시는 분들께 조금이나마 도움이 되었으면 합니다.

그럼 오늘도 좋은 하루 보내시기 바랍니다.. ^^;


<i>이 글은 블로그 이전으로 티스토리에서 가져온 글입니다.</i>

댓글

생각을 남겨주세요

0

아직 댓글이 없습니다.

같은 주제의 글