次の 2 つの部分に分割されたプロジェクトがあります。
- 実行可能
- としょうかん
実行可能部分にはクライアント固有のコードがありますが、ライブラリにはさまざまなクライアント プロジェクト間で変更されない汎用機能があります。
現在、GHC は実行可能ファイルとすべての依存関係を静的に 1 つのファイルにコンパイルするため、コンパイル時にそれぞれ 25 MB の実行可能ファイルを作成する 5 つのプロジェクトがあります。
私が代わりにやりたいことは、すべての依存関係を含むライブラリを静的に 1 つのファイルにコンパイルして、実行可能ファイルを動的にロードできるようにすることです。外部依存関係のすべての .a ファイルが 1 つの .so ファイルにコンパイルされるようにします。
私がやりたいことを説明する引用 ( Generating single .so from multiple C++ and C object files ):
最も簡単な方法は、すべてのオブジェクト ファイルを結合するか、2 つの静的 .a ライブラリを構築してからそれらを 1 つの共有ライブラリにリンクすることにより、それらを 1 つの .so ファイルに結合することです。
これはGHCでも可能ですか?
分割オブジェクトを使用して、すべてのライブラリを動的にリンクするさまざまなソリューションを検討してきましたが、やりたいことの解決策が見つからないようです。
編集:セットアップとこれまでに試したことに関する情報を追加します。
私のセットアップ
現在、ライブラリの cabal-install バージョン 1.18.1.2 および 1.18.1.1 を使用しています。
プロジェクトをサンドボックスにセットアップしました。
$ cabal sandbox init
$ cabal install --dependencies-only
$ cabal configure
これにより、すべての依存関係がプロジェクト ディレクトリの .cabal-sandbox にインストールされます。各依存関係フォルダー内には、コンパイルされた .a ファイルがあります。例として、acid-state-0.12.1 を参照してください。
▾.cabal-sandbox/
▾lib/
▾x86_64-linux-ghc-7.6.3/
▸acid-state-0.12.1/
▸ Data/
FileIO.hi
libHSacid-state-0.12.1.a
Paths_acid_state.hi
▸aeson-0.6.2.1/
▸base-unicode-symbols-0.2.2.4/
▸base64-bytestring-1.0.0.1/
▸blaze-builder-0.3.1.1/
▸blaze-html-0.6.1.1/
▸blaze-markup-0.5.1.5/
▸blaze-textual-0.2.0.8/
▸cereal-0.4.0.0/
▸clay-0.8/
▸clock-0.3/
▸dlist-0.5/
▸email-validate-1.0.0/
▸entropy-0.2.2.4/
▸extensible-exceptions-0.1.1.4/
▸gd-3000.7.3/
▸happstack-lite-7.3.1/
▸happstack-server-7.3.1/
▸hslogger-1.2.3/
▸MissingH-1.2.0.2/
▸monad-control-0.3.2.2/
▸postgresql-libpq-0.8.2.4/
▸postgresql-simple-0.3.8.0/
▸safecopy-0.8.2/
▸scrypt-0.3.6/
▸sendfile-0.7.9/
▸system-filepath-0.4.8/
▸threads-0.5.0.2/
▸time-compat-0.1.0.3/
▸transformers-base-0.4.1/
▸utf8-string-0.3.7/
冒頭で述べたように、プロジェクトは以下の cabal ファイルに示すように 2 つの部分に分かれています (例を短くするために一部の情報が削除されていることに注意してください)。
name: myserver
version: 0.1.0.0
build-type: Simple
cabal-version: >=1.8
library
hs-source-dirs: lib
ghc-options: -Wall -fno-warn-orphans -fno-warn-unused-do-bind -threaded
exposed-modules:
Crypto.SimpleScrypt,
Util.Response,
Html.Components,
Storage.Memory,
Storage.Disk
build-depends:
base >=4.6 && <4.7,
bytestring >=0.10 && <0.11,
MissingH >=1.2 && <1.3,
happstack-lite >=7.3 && <7.4,
clay >=0.8 && <0.9,
text >=0.11 && <0.12,
blaze-markup >=0.5 && <0.6,
blaze-html >=0.6 && <0.7,
postgresql-simple >=0.3 && <0.4,
mtl >=2.1 && <2.2,
acid-state >=0.12 && <0.13,
safecopy >=0.8 && <0.9,
containers >=0.5 && <0.6,
scrypt >=0.3 && <0.4,
transformers >=0.3 && <0.4,
happstack-server >=7.3 && <7.4,
time >=1.4 && <1.5,
filepath >=1.3 && <1.4,
directory >=1.2 && <1.3,
gd >=3000.7 && <3000.8,
aeson >=0.6 && <0.7,
email-validate >=1.0 && <1.1,
clock >=0.3 && <0.4,
random >=1.0 && <1.1
executable myserver
hs-source-dirs: app
main-is: App.hs
ghc-options: -Wall -fno-warn-orphans -fno-warn-unused-do-bind -threaded
build-depends:
base >=4.6 && <4.7,
bytestring >=0.10 && <0.11,
MissingH >=1.2 && <1.3,
happstack-lite >=7.3 && <7.4,
clay >=0.8 && <0.9,
text >=0.11 && <0.12,
blaze-markup >=0.5 && <0.6,
blaze-html >=0.6 && <0.7,
postgresql-simple >=0.3 && <0.4,
mtl >=2.1 && <2.2,
acid-state >=0.12 && <0.13,
safecopy >=0.8 && <0.9,
containers >=0.5 && <0.6,
scrypt >=0.3 && <0.4,
transformers >=0.3 && <0.4,
happstack-server >=7.3 && <7.4,
time >=1.4 && <1.5,
filepath >=1.3 && <1.4,
directory >=1.2 && <1.3,
gd >=3000.7 && <3000.8,
aeson >=0.6 && <0.7,
email-validate >=1.0 && <1.1,
clock >=0.3 && <0.4,
random >=1.0 && <1.1,
myserver
これまでに試したこと
ライブラリと実行可能ファイルに追加しようとし-shared -fPIC
ました。しかし、それはこのエラーを生成しました:ghc-options
-dynamic
Linking a.out ...
/usr/bin/ld: /home/rzetterberg/development/haskell/myserver/.cabal-sandbox/lib/x86_64-linux-ghc-7.6.3/scrypt-0.3.6/libHSscrypt-0.3.6.a(Scrypt.o): relocation R_X86_64_32S against `stg_CAF_BLACKHOLE_info' can not be used when making a shared object; recompile with -fPIC
/home/rzetterberg/development/haskell/myserver/.cabal-sandbox/lib/x86_64-linux-ghc-7.6.3/scrypt-0.3.6/libHSscrypt-0.3.6.a: could not read symbols: Bad value
collect2: error: ld returned 1 exit status
問題は、どこから始めればよいか本当にわからないことです。それが、私が助けを求めている理由です。