2016-06-19 2 views
1

나는 수천 개의 레코드를 저장하기 위해 sqlite 데이터베이스를 사용하는 Lazarus 응용 프로그램을 구축하고 있습니다. 지금은 sqlite3.dll을 통해 동적으로 sqlite 라이브러리에 연결합니다.정적 링크 sqlite in Lazarus

정적으로 링크 할 수 있습니까? 어디에서 Lazarus 호환 lib 파일을 찾을 수 있습니까?

참고 : 저는 한 달 전에 Lazarus와 Free Pascal을 사용하기 시작 했으므로 매우 분명해 보였던 부분이 저에게는 맞지 않을 수 있습니다. 그래서 나와 조금 곰.

건배

답변

3

실제 정적 링크는 TSQLite3Connection 성분이 본질적으로 적극적 sqlite3를 DLL을로드하도록 설계되어 있기 때문에 어렵다. 즉, 프로그램을 컴파일 할 때 라이브러리와 연결되지 않고 런타임에 DLL을 동적으로로드하도록 구성 요소가 코딩됩니다.

완전히 자체 포함 된 프로그램을 찾으려면이 두 가지 방법을 수행 할 수 있습니다.

  1. 동적으로 DLL을로드하는 대신 sqlite3에 대해 정적으로 링크하는 새 TSQLite3Connection 구성 요소를 만듭니다.
  2. 프로그램에 리소스로 sqlite3.dll을 포함시키고 프로그램을 실행하기 전에 자동으로 배포하십시오.

해결책 # 1은 사소한 것이 아니며 희미한 심장의 경우가 아닙니다. 나는 그것을했고 컴포넌트에 대한 링크를 포함하려고했지만 결과가 안정적이지 않습니다. 문제는 실제 문제가 아닌 sqlite3의 정적 버전을 컴파일해야하지만 MinGW에서 gcc와 같은 문제를 해결해야한다는 것입니다. MinGW에서 gcc로 컴파일한다는 것은 libgcc.a에서 링크해야한다는 것을 의미하며, FreePascal의 내부 링커는 stdcall 심볼을 올바르게 해석하는 방법을 모르기 때문에 MinGW의 libkernel32.a 및 libmsvcrt.a에 링크해야합니다. 결과가 안정적이지 않습니다. 풍성한 충돌.

솔루션 # 2는 상당히 쉬워야하지만 나사로 관리자는 조금 힘들어합니다. 실행 파일에 dll을 리소스로 저장하는 부분은 수행하기 쉽습니다. 그리고 임시 파일로 쓰고 있습니다. 문제는 TSQLite3Connection 구성 요소가 어디에서 찾을지를 알 수 없다는 것입니다. 따라서 실행 파일의 폴더 나 시스템 폴더에서 찾습니다. 어느 쪽도 반드시 실행 파일에 의해 기록 될 수 없습니다. 프로그램이 쓸 수있는 유일한 장소는 임시 폴더뿐입니다. 그래서 내가 한 일은 TSQLite3Connection 컴포넌트 호출 TSQLite3DynConnection의 새로운 버전으로 만들어졌습니다. 즉, DLL이 어디에 있는지 동적으로 지정할 수 있습니다. ClientLibrary라는 게시 된 속성을 만들어 dll의 위치를 ​​지정할 수 있습니다 (dll로 끝나지 않아도되므로 시스템 임시 파일 이름 생성 루틴을 사용할 수 있습니다). 이 구성 요소는 http://icculus.org/~kfitzner/misc/sqlite3dyndll.zip에서 얻을 수 있습니다. 그것은 내가 사용하는 두 가지 버전 인 Lazarus 1.6.2 FP 3.0.0 또는 FP 1.0.6/FP 2.6.0에 대해 컴파일됩니다.

안정적으로 정적으로 링크 된 버전을 얻을 수 있다면이 답변을 업데이트하겠습니다.

2 2016 년 12 월 2 일 업데이트 : 나는 static version을 안정적으로 관리 할 수있었습니다.

+0

나는이 질문을 잊어 버렸음을 사과한다. 이 질문을 게시 한 직후 옵션 # 2를 사용했습니다. :) –

+0

최근에 보닛에 버그가 생겨서 마침내 그것에 대해 뭔가를 할 때까지 나는 꽤 오랫동안 일부 작업을 수행했습니다. 정적 버전이 안정적으로 작동하고 링크가 포함 된 답변이 업데이트되었습니다. –