ASP.Net Core Mvc에서 SQLite생성시 라이브러리 에러

안녕하세요.
ASP.Net Core Mvc에서 SQLite를 써보려고 하는데 로컬 개발환경에서는 문제없이 작동하는데
서버에 디플로이를 하면 SQLite의 라이브러리를 찾을수 없다는 에러가 발생합니다.

An unhandled exception occurred while processing the request.
DllNotFoundException: Unable to load shared library 'e_sqlcipher' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libe_sqlcipher: cannot open shared object file: No such file or directory
SQLitePCL.SQLite3Provider_e_sqlcipher+NativeMethods.sqlite3_libversion_number()

여기저기 구글링해봐도 같은 문제가 발생했다는 질문들은 많은데 확실히 해결했다는 답변이 없네요.

설치한 SQLite관련 라이브러리는 이렇습니다.

Microsoft.Data.Sqlite.Core
SQLitePCLRaw.bundle_e_sqlcipher
SQLitePCLRaw.bundle_e_sqlite3
SQLitePCLRaw.bundle_green
SQLitePCLRaw.bundle_sqlcipher
SQLitePCLRaw.core
SQLitePCLRaw.lib.e_sqlcipher
SQLitePCLRaw.lib.e_sqlite3
SQLitePCLRaw.lib.e_sqlite3.linux
SQLitePCLRaw.lib.sqlcipher.linux
SQLitePCLRaw.provider.e_sqlcipher
SQLitePCLRaw.provider.e_sqlite3
SQLitePCLRawEx.bundle_e_sqlcipher
SQLitePCLRawEx.bundle_green
SQLitePCLRawEx.lib.e_sqlcipher

에러가 나서부터 다 때려넣었더니 양이 엄청 많아졌네요.
예전에 WinForm앱 개발할때 x86 x64 폴더를 만들어서 별도 라이브러리를 넣어줬던게 생각나서
Linux에서도 비슷한걸 해줘야 하는가 싶어서 알아보니
컴파일 후에 runtimes라는 폴더가 생성되는걸 알았네요.

\bin\Release\net6.0\runtimes\linux-x64\native
libe_sqlcipher.so
libe_sqlite3.so
libsqlcipher.so

이 3개의 라이브러리를 어딘가에 넣어줘야 할것 같은데
구글링해서 /usr/lib/나 프로젝트 디렉토리에 넣어보기도 했는데 결과는 바뀌질 않네요.

어느 사이트에서는 윈도우 라이브러리 dll을 그대로 플젝 디렉토리에 넣으면 된다라고 해서 해봤는데 그것도 아니고… :sob:
이거로 2주째 삽질중인데 절대 검색으로는 안나올것 같아서 최후의 보루에 기대봅니다.

고수님들의 가르침을 부탁드립니다. :man_bowing:

1 Like

G(4)선생님 답변입니다, 참고할 부분이 있을지 한번 살펴보시겠어요.


ASP.NET Core MVC 프로젝트에서 SQLite와 특히 e_sqlcipher를 사용할 때 서버에 배포한 후 라이브러리를 찾을 수 없는 문제는 종종 발생합니다. 여기서 문제는 e_sqlcipher가 서버 환경에 적절히 설치되지 않았거나, 애플리케이션이 해당 라이브러리를 찾을 수 있는 경로를 알지 못하기 때문일 수 있습니다. 해결 방법은 다음과 같습니다:

  1. 라이브러리 설치 확인: 서버에서 e_sqlcipher 및 필요한 모든 SQLite 관련 라이브러리가 올바르게 설치되어 있는지 확인하세요. 필요한 경우, 서버의 OS에 맞는 e_sqlcipher 패키지를 직접 설치해야 할 수도 있습니다.

  2. 환경 변수 설정: LD_LIBRARY_PATH 환경 변수에 e_sqlcipher 라이브러리가 위치한 디렉토리를 추가합니다. 이렇게 하면 애플리케이션이 해당 라이브러리를 찾을 수 있게 됩니다. 예를 들어, e_sqlcipher 라이브러리가 /usr/local/lib에 있다면, 다음과 같이 설정할 수 있습니다:

    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
    

    이 명령을 실행 후, 애플리케이션을 재시작합니다.

  3. 라이브러리 경로 확인: 애플리케이션을 배포할 때, runtimes/linux-x64/native 디렉토리에 있는 네이티브 라이브러리들이 올바른 위치에 배치되었는지 확인하세요. 일반적으로 이 라이브러리들은 애플리케이션 실행 파일과 같은 디렉토리에 있거나 시스템 라이브러리 경로 중 하나에 있어야 합니다.

  4. 프로젝트 파일 확인: 프로젝트의 .csproj 파일을 검토하여 모든 필요한 SQLitePCLRaw 패키지가 올바르게 참조되고 있는지 확인하세요. 불필요하거나 중복된 패키지 참조가 없는지도 확인합니다.

  5. 종속성 문제 해결: 때로는 특정 OS 버전이나 아키텍처에 필요한 종속성이 누락되어 문제가 발생할 수 있습니다. 예를 들어, e_sqlcipher를 사용하려면 추가적인 암호화 라이브러리가 필요할 수 있습니다. 해당 OS의 패키지 관리자를 통해 이러한 종속성을 설치합니다.

  6. 디버깅 정보 활용: 문제를 진단하기 위해 LD_DEBUG 환경 변수를 설정하는 것도 도움이 될 수 있습니다. 이를 통해 라이브러리 로딩 과정에 대한 자세한 정보를 얻을 수 있습니다. 예를 들어:

    export LD_DEBUG=libs
    

    이후 애플리케이션을 실행하여 로그를 확인합니다.

위의 방법들로 문제가 해결되지 않는 경우, 서버의 OS 버전, 아키텍처, 그리고 .NET Core 버전 등 추가 정보를 제공하면 더 구체적인 해결 방법을 제시할 수 있을 것입니다.

1 Like

답변 감사합니다. SQLite는 정말 설정부분이 어려운거 같아요.
윈폼에서는 그나마 라이브러리 폴더설정만으로 끝났는데 리눅스환경이 되니까 차원이 다르네요.
설명해주신 부분을 하나하나 해보았지만 결과는 변함없이 에러가 발생했습니다.
관련된 검색어로 다시 여기저기 찾아보았는데 제대로된 답변이 없네요.
일단 SQLite사용은 보류하기로 했습니다.
설정이 복잡해지면 한번은 어떻게 했다하더라도 다른 환경에서 다른 문제가 생기면 해결하는데 시간이 걸릴것 같아서 확실한 방법이 보일때까지 기다리기로 했습니다.

바쁜시간 자세한 답변 주셨는데 시원하게 해결하지 못해서 미안합니다.
가끔 찾아보면서 문제 해결되면 보고올리겠습니다.
감사합니다.

1 Like

이게 도움이 될진 모르겠네요…
MAUI에서 로컬데이터베이스로 Sqlite Nuget으로 하는건데요.

제가 예전에
maui 프로젝트로 Window와 Android에서는 정상적으로 동작되었는데

리눅스에서도 이상없이 동작될거라 생각이 되네요 :slight_smile:

p.s 참고로 예전에 이거 관련된 글을 공유했었네요.

3 Likes