20

私のプロジェクトでカバールを実行する際に問題が発生しています。このプロジェクトは以前は適切に実行されていましたが、どの変更が失敗したのか完全にはわかりません。GHC 7.6 と OSX Mavericksの間の問題に関連していると思います(ここではDarin Morrison の自作式を使用しています)。[編集:明確にするために、これは Mavericks のある時点で機能していたため、この仮説は成り立たない可能性があります。] 問題はリンクのステップにあるようです:

In-place registering chorez-0.1.0.0...
Preprocessing executable 'chorez' for chorez-0.1.0.0...
Linking dist/build/chorez/chorez ...
Undefined symbols for architecture x86_64:
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_AddResponse_con_info", referenced from:
      _s5X4_info in libHSchorez-0.1.0.0.a(Commands.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_ErrorResponse_static_info", referenced from:
      _chorezzzm0zi1zi0zi0_ChorezzziCommands_route1_closure in libHSchorez-0.1.0.0.a(Commands.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_parseRequest_closure", referenced from:
      _r7eV_srt in libHSchorez-0.1.0.0.a(Server.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_parseRequest_info", referenced from:
      _s7nh_info in libHSchorez-0.1.0.0.a(Server.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_zdfToJSONResponse1_closure", referenced from:
      _r7eS_closure in libHSchorez-0.1.0.0.a(Server.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_zdfToJSONResponse4_closure", referenced from:
      _s7ng_info in libHSchorez-0.1.0.0.a(Server.o)
      _r7eQ_closure in libHSchorez-0.1.0.0.a(Server.o)
      _r7eV_srt in libHSchorez-0.1.0.0.a(Server.o)
  "_chorezzzm0zi1zi0zi0_ChorezzziRequest_zdfToJSONResponse5_closure", referenced from:
      _s7ng_info in libHSchorez-0.1.0.0.a(Server.o)
      _r7eV_srt in libHSchorez-0.1.0.0.a(Server.o)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

これらのシンボルはすべて、私自身のプロジェクトからのものです (名前から判断すると)。これについて私が見たほとんどの回答は、特定のライブラリが適切にリンクされていないことに関係しています。これらのシンボルのいくつかはderiveToJSONfromによって生成されていると思われData.Aeson.THます。解決せずに数回再インストールしました。何か案は?

4

3 に答える 3

31

これが最終的に修正されたものです。私のカバル構成は次のようなものでした:

library
  exposed-modules:
      My.Module1
    , My.Module3


executable my-executable
  main-is:             Main.hs
  build-depends:
      base >=4.6 && <4.7
    , chorez

実行可能インポートの Main.hs My.Module3My.Module3private をインポートしMy.Module2ます。問題My.Module2exposed-modules修正しました。見つからなかったすべてのシンボルがそのモジュールからのものであることに気付いたので、これを理解しました。cabal replうまくいきました(モジュールを手動でテストしましたが、基本的にはすべて機能しました)が、そうでcabal runはありませんでした。実行可能ファイルでプライベート モジュールを含むライブラリを使用できるようにする必要があると思いますが、この場合、新しいモジュールをリストに追加するのを忘れただけで、モジュールをプライベートにする理由がないので、準備が整いました。そして今のところ走っています。

于 2013-11-03T00:18:20.013 に答える
9

パーティーには少し遅れましたが、公開されていないモジュールをother-modulesセクションに配置する必要があります。

Cabalユーザーガイドから:

パッケージに含まれるモジュール

ライブラリの場合cabal init、プロジェクト ディレクトリで Haskell モジュールのように見えるファイルを探し、すべてのモジュールをexposed-modulesフィールドに追加します。パッケージのパブリック インターフェイスの一部を形成しないモジュールの場合、それらのモジュールをother-modulesフィールドに移動できます。いずれにしても、ライブラリ内のすべてのモジュールを一覧表示する必要があります。

于 2015-10-20T17:27:24.443 に答える