2017-03-07 10 views
1

私はOGDF外部C++ライブラリとのインターフェイスが必要なプロジェクトをocamlで開発しています。それはすべて私のMacで起動しているが、今OcamlのMinGW CygwinポートであるWindows用のOcaml(https://fdopen.github.io/opam-repository-mingw/)を使用してWindows版を作成しようとしています。このバージョンでは、ocamlをCコードでインターフェイスすることはできますが、うまくいきますが、そのCコードに外部ライブラリを組み込もうとすると、リンカからエラーが発生します。これはflexdll(https://github.com/alainfrisch/flexdll)です。リンカーは、ライブラリ全体で_Unwind_Resumeと__emutls_get_addressのシンボルを解決できないと言います。ここでウィンドウと外部Cライブラリとの接続エラーocaml

はおもちゃの例である:

マイ.mlのファイルt.ml:

external print : unit -> unit = "print" 

let() = 
    Printf.printf "platform: %s\n" (Sys.os_type); 
    print() 

私の.cppファイルのtc.cpp:

#include <stdio.h> 
#include "caml/mlvalues.h" 
#define CAML_NAME_SPACE 
//#include <ogdf/basic/Graph.h> 

extern "C" value print(value unused) { 
    printf("hello from C\n"); 
    return Val_unit; 
} 

私のメイクファイル:

t.exe: t.ml tc.o 
    ocamlopt -verbose -ccopt -pthread \ 
    -cclib -lstdc++ -w s \ 
    -ccopt -L../cdeg/ogdf/_release \ 
    -cclib -lOGDF \ 
    tc.o t.ml \ 
    -o t.exe 

tc.o: tc.cpp 
    x86_64-w64-mingw32-gcc -c \ 
    -march=x86-64 -mtune=generic -O2 -mms-bitfields -Wall -Wno-unused \ 
    tc.cpp \ 
    -I../cdeg/ogdf -L../cdeg/ogdf/_release -lOGDF \ 
    -I ~/.opam/4.04.0+mingw64c/lib/ocaml \ 
    -lstdc++ -pthread -o tc.o 

このように、すべてうまくコンパイルされますが、unc omment ogdfがtc.cppに行を含め、私は次のような出力が得られます。

$ make 
x86_64-w64-mingw32-gcc -c \ 
-march=x86-64 -mtune=generic -O2 -mms-bitfields -Wall -Wno-unused \ 
tc.cpp \ 
-I../cdeg/ogdf -L../cdeg/ogdf/_release -lOGDF \ 
-I ~/.opam/4.04.0+mingw64c/lib/ocaml \ 
-lstdc++ -pthread -o tc.o 
ocamlopt -verbose -ccopt -pthread \ 
-cclib -lstdc++ -w s \ 
-ccopt -L../cdeg/ogdf/_release \ 
-cclib -lOGDF \ 
tc.o t.ml \ 
-o t.exe 
+ x86_64-w64-mingw32-as -o "t.o" "C:\OCaml64\tmp\camlasme5f9bd.s" 
+ x86_64-w64-mingw32-as -o "C:\OCaml64\tmp\camlstartupf2b3f1.o" "C:\OCaml64\tmp\camlstartup101e51.s" 
+ flexlink -chain mingw64 -stack 33554432 -exe -o "t.exe" "-LC:/OCaml64/home/Nathaniel.Miller/.opam/4.04.0+mingw64c/lib/ocaml" -pthread -L../cdeg/ogdf/_release "C:\OCaml64\tmp\camlstartupf2b3f1.o" "C:/OCaml64/home/Nathaniel.Miller/.opam/4.04.0+mingw64c/lib/ocaml\std_exit.o" "t.o" "C:/OCaml64/home/Nathaniel.Miller/.opam/4.04.0+mingw64c/lib/ocaml\stdlib.a" "-lstdc++" "-lOGDF" "tc.o" "C:/OCaml64/home/Nathaniel.Miller/.opam/4.04.0+mingw64c/lib/ocaml\libasmrun.a" -lws2_32 
** Cannot resolve symbols for ../cdeg/ogdf/_release\libOGDF.a(PoolMemoryAllocator.o/ 
PreprocessorLayout.o/ 
extended_graph_alg.o/ 
graph_generators.o/ 
random_hierarchy.o/ 
simple_graph_alg.o/ 
CPlanarEdgeInserter.o/ 

... [a bunch of other .o files from the library]... 

UpwardPlanarModule.o/ 
UpwardPlanarSubgraphModule.o/ 
UpwardPlanarSubgraphSimple.o/ 
VisibilityLayout.o/ 
): 
_Unwind_Resume 
__emutls_get_address 
** Cannot resolve symbols for ../cdeg/ogdf/_release\libOGDF.a(basic.o): 
_Unwind_Resume 
File "caml_startup", line 1: 
Error: Error during linking 
make: *** [makefile:20: t.exe] Error 2 

私はOCamlのに接続し、代わりにそれはx86_64-の下でうまくコンパイルTCにmain()関数を追加しない場合w64-mingw32-gccが含まれています。私はいくつかの小さな外部ライブラリを含めてみましたが、この問題は発生しませんでした。

私の最初の考えは、リンクされたファイルがすべて同じ方法でコンパイルされているわけではないかもしれないということでしたが、ライブラリと.cppファイルをコンパイラとオプションでocamlopt -configureで指定してコンパイルしました。そして、それらがすべて同じ方法でコンパイルされていない場合は、tc.cppをocamloptや外部ライブラリで個別に動作させることはできませんが、両方を使用しようとするとエラーが発生します。これはWindows用のOcaml、またはflexdllの問題か、これらのいずれかのインストールですか?私は次に何をしようとするのか迷っています。ここで何が起こっているかについてのアイデア、提案、および/または説明は非常に高く評価されます。

+0

私の推測では、フレックスリンクの制限です。 '-ccopt -pthread'(これは '-ccopt-link -ccopt -pthread'と同じです)はflexlinkでは理解できません。それはgccのツールチェーンに渡すことができます。しかし、flexlinkはシンボル自体を解決しようとしますが、失敗するのは '-pthread'によって何が暗示されているのか分かりません。 – rafix

+0

Flexlinkは間違いなく、犯人のようです - 私の答えは下記をご覧ください。 -pthreadフラグをインクルードしてもいなくても、壊れたバージョンや作業バージョンでは違いはありませんが、おそらくOGDFと問題のない他のライブラリとの違いは、OGDFが積極的であるということですPosixスレッドを使用することを行う。 –

答えて

1

私は部分的な答えがあります。 Flexdllから何とかして問題が起こっています。私はgccでocamlのCygwin版を使用しましたが、同じ問題が残っていました。次に、-no-shared-libsフラグで設定されたocamlを再コンパイルします。これにより、ocamloptはflexdllの代わりにgccとリンクし、すべてがコンパイルされます。

+0

私は最終的に、構成ファイルを手作業で編集することによって、flexdllなしでmcwlのocamlをコンパイルすることもできました。オリジナルのプロジェクトをコンパイルするためにocamlのバージョンを使用することができました。このプロジェクトではlablgtk2ライブラリも使用していますので、再コンパイルしたバージョンのocamlで再コンパイルする必要がありました。 –