說我有一個dictionary.txt
文件,我需要將它讀入映射並在我的程序中使用它,我如何才能使這個dictionary.txt文件包含在編譯的exe文件中?如何將資源編譯成Haskell中的二進制文件?
21
A
回答
12
可以將序列化數據類型存儲爲字節字符串。這裏有一個例子:
- http://code.haskell.org/~dons/code/compiled-constants/
- http://haskell.org/haskellwiki/Compiling_in_constants
然而,file-embed自動執行此過程,使它更容易做不平凡的嵌入。
所有這些方法基本上可以歸結爲代表的靜態數據看作一個字節字符串,
{-# LANGUAGE OverloadedStrings #-}
import Data.Binary
import qualified Data.Map as M
import qualified Data.ByteString.Char8 as S
import Data.ByteString.Lazy
import Codec.Compression.GZip
--
-- this is a gzip compressed literal bytestring, storing a binary-encoded Data.Map
--
mytable =
"\US\139\b\NUL\NUL\NUL\NUL\NUL\NUL\ETXEN\
\\219\SO\194 \f\197\224\188\196\CAN\227\US\
\\224\171~\NAKc\GS4ce\161`\178\191\215(\176\
\\190\180\167\231\210\n\241\171\203\191\ti\
\\157\217\149\249< \ENQ\214\&9>\202\162\179a\
\\132X\233\ESC=\231\215\164\SYN\157\DC2D\226*\
\\146\174o\t\167\DLE\209\"i_\240\193\129\199<W\
\\250nC\CAN\212\CAN\162J\160\141C\178\133\216;\
\\\@4\144-W\203\209x\205\140\166\RS\163\237]9f\
\\170\143\ACK\163g\223\STX\184\&7\rH\222\FSW\
\\130\&7D\197\NUL\164\&0U\193\186\t\186o\
\\228\180~\NUL\a6\249\137#\SOH\NUL\NUL"
main = print =<< M.lookup "ghc" m
where
-- build the table from the bytestring:
m :: M.Map String (Maybe String)
m = decode . decompress . fromChunks . return $ mytable
21
你必須拿出你自己的方式把它放到地圖中,但http://hackage.haskell.org/package/file-embed會將它放到你的編譯好的二進制文件中。我們使用它來在我們的一些Web應用程序中嵌入模板。
6
您可以使用自定義Makefile
/Setup.hs
掛鉤並調用windres
(如果你使用的是Windows)或objcopy
/elfrc
(如果你是在Linux上)編譯資源COFF/ELF對象,你可以接着用結合你的Haskell對象文件形成最終的可執行文件。然後,您可以使用Haskell的FFI這樣的(未測試)訪問資源:
-- We have an image resource called "_imgdata"
foreign import ccall "&" _imgdata :: CString
-- Size of _imgdata is 405585 bytes.
imgdata :: CStringLen
imgdata = (_imgdata, 405585)
這個解決方案會比使用file-embed更有效(不CString
- >ByteString
轉換回事),但也更復雜。另外,我還需要資源文件支持during my work on cabal-install,所以它可能會被集成到未來版本的Cabal(如果我將實現它)。
6
我強烈推薦你使用Template Haskell,加載該文件,並把它變成一個Haskell數據類型。它不僅會被編譯到最終的二進制文件中,而且會被完全優化。
相關問題
- 1. 如何將資源編譯到二進制文件中?
- 2. Xcode編譯源文件並將未編譯的源文件複製到資源
- 3. 如何編譯二進制文件?
- 4. 編譯二進制文件
- 5. 二進制編程的資源
- 6. 如何將GCC編譯爲靜態二進制文件?
- 7. 任何方式來反編譯古代編譯器構建的二進制資源文件?
- 8. 將資源合併到一個二進制文件中
- 9. 如何在Windows中將Javascript文件編譯爲二進制文件?
- 10. pip編譯vs二進制文件
- 11. 使用VexCL「編譯二進制文件」
- 12. 反編譯非PC二進制文件
- 13. 如何添加二進制資源
- 14. 如果將qrc資源正確編譯到二進制文件中,哪裏可以丟失?
- 15. 將XML文件編譯爲二進制文件
- 16. 如何在Ubuntu中編譯Windows二進制文件?
- 17. gdb:使用-g編譯的二進制文件與使用-g編譯的二進制編譯的代碼
- 18. 如何從交叉編譯的二進制生成彙編?
- 19. GCC編譯的二進制文件給予 「不能執行二進制文件」
- 20. g ++編譯的二進制文件給「不能執行二進制文件」
- 21. haskell和大的二進制文件
- 22. 無法將許可證文件轉換爲二進制資源
- 23. 如何將C編譯爲OSX中的原始二進制文件?
- 24. 如何使用預編譯的二進制文件安裝CLang?
- 25. Perforce:如何在編譯源代碼時自動檢出二進制文件
- 26. 編譯ADB源生成亞行二進制
- 27. 將VS2008編譯與Windows 7兼容的二進制文件
- 28. 如何將* .lua文件編譯爲資源庫?
- 29. 從C#中的資源獲取二進制文件
- 30. Heroku中的資源不能編譯成一個文件
自從它的模板以來,最終用戶不需要文件嵌入嗎? – alternative
嵌入可執行文件有意義嗎? –