2012-11-18 33 views
5

的SQLite我試圖用靜態鏈接sqlite3的沒有成功。我正在使用'等c.sqlite3'標題和sqlite3合併。要創建我都試過VC++和MinGW-GCC的.LIB文件,這兩個成功編譯源文件 - 但他們都產生COFF對象格式(optlink,其DMD使用,可與OMF)。在閱讀「digitalmars.D」上的大量帖子後,我嘗試了幾種不同的解決方案。靜態鏈接與DMD(視窗86)

objconv:

  • 試圖轉換與GCC創建LIB文件,導致不確定的符號,如__divdi3和__muldi3,沒能解決這個問題。

  • 也試過這種轉換的sqlite3.o文件* OBJ,然後用digitalmars 'LIB.EXE' - 不成功以及

  • 在VC++嘗試objconv產生的lib失敗,因爲:「SQLite的的.lib是導入庫」

implib:

  • 如果我下載從sqlite.org預編譯的DLL和使用IMPLIB,它產生人IB文件,但該名稱重整似乎並不匹配,因爲即使我與靜態庫鏈接,我仍然收到同樣的sqlite的錯誤(例如未定義的符號_sqlite3_open_sqlite3_errmsg_sqlite3_close ...

coffimplib:

  • 如果我使用coffimplib在VC++創建的庫文件,該程序生成一個幾乎空文件(〜2KB)只包含垃圾(在所有即沒有符號和大多隻是「空」值)。

  • 如果我做了GCC創建的庫一樣,coffimplib抱怨「不導入庫」,並且不產生轉換後的庫文件。

如果我用DMC編譯sqlite3的合併,編譯失敗抱怨噸錯誤。所以在這裏,我陷入了困境,有沒有人有任何想法或提示可以解決這個問題?

注意:我不想用一個DLL,但使用SQLite靜態鏈接(可執行文件的大小問題)。

+0

你跟C編譯器得到什麼錯誤? –

+0

噸和噸。它需要太多的方式來解決所有的錯誤(例如非法的投射,未知的標識) –

+0

我下載並嘗試了DMC;看起來這些錯誤是由DMC附帶的Windows頭文件中的錯誤引起的。 –

回答

3

嘗試使用implib/system開關。

+0

這實際上做了詭計!雖然這創建了一個導入庫,而不是一個靜態庫,所以可執行文件仍然依賴於整個sqlite dll,當它只使用其功能的〜5個時 –

0

爲什麼你根本不編譯和您的應用程序d鏈接SQLite的C代碼?我想這會讓你免遭與圖書館相關的麻煩。

當然,一個好的辦法是編譯DMC SQLite的靜態庫,並通過簡單地做你的d項目中使用它:dmd -of myproggy myproggy.d somefile.d libsqlite.lib

+0

Dmc無法編譯SQLite合併(請參閱我的意見)。如果我想鏈接,對象需要採用OMF格式,這就是我的問題的根源! –

1

在Windows上你和DLL的更好。爲您節省很多頭痛。

x64支持工作正在進行中,這將利用COFF + VC的鏈接器,我認爲。 這將有望改變尷尬的局面。

編輯:如果你真的需要靜態庫,你可以嘗試出Unilink的,這是能夠鏈接OMF和COFF文件放在一起: ftp://ftp.styx.cabel.net/pub/UniLink

+0

是的,這就是我目前使用的,但並非所有的庫支持共享的(例如dyncall),並且在生成小的可執行文件時(相對於依賴關係)應用程序大小跳轉 –

+0

更新了我的文章 – Trass3r

+0

Unilink確實是一個有趣的選擇!我會檢查它(雖然淺層文件)。你有什麼想法什麼時候可以使用x64支持COFF? –