2016-06-19 19 views
1

私は数千のレコードを格納するためにsqliteデータベースを使用するLazarusでアプリケーションを構築しています。今はsqlite3.dllを介してsqliteライブラリに動的にリンクしています。Lazarusの静的リンクsqlite

静的にリンクすることはできますか?どこでLazarus互換のlibファイルを見つけることができますか?

メモ: 私はLazarusとFree Pascalを1ヶ月前から使用していましたので、非常に明白に見えるものが私にはないかもしれません。だから、私には少し熊。

乾杯

答えて

3

実際の静的リンクTSQLite3Connection成分は、本質的に活発にするSQLite3 DLLをロードするように設計されているので困難です。言い換えれば、プログラムをコンパイルするときにライブラリとリンクしていないため、実行時に動的にDLLをロードするようにコンポーネントがコーディングされています。

完全に自己完結型プログラムをお探しの場合は、この2つの異なる方法を実行できます。

  1. DLLを動的にロードする代わりに、静的にsqlite3にリンクする新しいTSQLite3Connectionコンポーネントを作成します。
  2. プログラムにリソースとしてsqlite3.dllを含め、プログラムを実行する前に自動的に展開させます。

解決策#1は些細なことではなく、かすかな心のためではありません。私はそれをやって、コンポーネントへのリンクを含めることを意図しましたが、結果は安定していません。問題は、sqlite3の静的なバージョンをコンパイルしなければならないということです。これは実際の問題ではありませんが、MinGWの下でgccのようなものを実行しなければならないという問題があります。 MinGWでgccでコンパイルすると、libgcc.aをリンクする必要があります。また、FreePascalの内部リンカーはstdcallシンボルを正しく解釈する方法を知らないため、MinGWのlibkernel32.aとlibmsvcrt.aにリンクする必要があります。結果は安定していません。豊富なクラッシュ。

解決策2はかなり簡単ですが、Lazarusの保守担当者はそれを少し難しくします。実行可能ファイル内にdllをリソースとして格納する部分は、実行するのは簡単です。それで、それを一時ファイルとして書き出します。問題は、TSQLite3Connectionコンポーネントにどこにそれを見つけるかを伝えることができないことです。したがって、実行可能ファイルのフォルダーまたはシステムフォルダー内に表示されます。どちらも実行可能ファイルによって必ず書き込まれることはありません。あなたのプログラムが書き込むことができる唯一の場所は一時フォルダです。だから、私がやったのは、TSQLite3Connectionコンポーネント・コールTSQLite3DynConnectionの新しいバージョンが作成されたことです。つまり、DLLの場所を動的に指定することができます。 ClientLibraryという名前のパブリッシュされたプロパティを作成しました。そこではdllの場所を指定できます(.dllで終わる必要はないので、システムの一時ファイル名生成ルーチンを使用できます)。このコンポーネントはhttp://icculus.org/~kfitzner/misc/sqlite3dyndll.zipにあります。私が使用する2つのバージョンである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

私は最近、ボンネットにバグがあり、ついにそれについて何かをするまで、かなりの時間を過ごしました。私は静的バージョンを今日安定して稼働させ、リンクで答えを更新しました。 –

関連する問題