私は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の問題か、これらのいずれかのインストールですか?私は次に何をしようとするのか迷っています。ここで何が起こっているかについてのアイデア、提案、および/または説明は非常に高く評価されます。
私の推測では、フレックスリンクの制限です。 '-ccopt -pthread'(これは '-ccopt-link -ccopt -pthread'と同じです)はflexlinkでは理解できません。それはgccのツールチェーンに渡すことができます。しかし、flexlinkはシンボル自体を解決しようとしますが、失敗するのは '-pthread'によって何が暗示されているのか分かりません。 – rafix
Flexlinkは間違いなく、犯人のようです - 私の答えは下記をご覧ください。 -pthreadフラグをインクルードしてもいなくても、壊れたバージョンや作業バージョンでは違いはありませんが、おそらくOGDFと問題のない他のライブラリとの違いは、OGDFが積極的であるということですPosixスレッドを使用することを行う。 –