了解しました。Ocamlyaccを使用してレクサーとパーサーを作成しています。私は自分の調査を行いましたが、それは私のmakefileがコンパイラーに適切なビットバージョンを選択していないことと関係があると思いますか?私はmakefileについてあまり知らないので、私は尋ねています。
私は自分のプログラムを別のコンピューターで実行しましたが、問題なく動作するので、自分のマシンと関係があるはずです。
MacBook Pro64ビットです。 Xcode4.2.1を使用しています。
これがmakefileです:
Shell = /bin/sh
C_C = gcc
CPP_C = g++
ifdef GPROF
C_CPP_FLAGS = -pg -O3
else
ifndef DEBUG
C_CPP_FLAGS = -O3
else
C_CPP_FLAGS = -g
endif
endif
C_LD = $(C_C)
CPP_LD = $(CPP_C)
C_YACC = bison
C_Lex = flex
AR = ar
RANLIB = ranlib
OCAML_C = ocamlc
OCAML_OPT_C = ocamlopt
ifdef GPROF
OCAML_C_FLAGS = -dtypes
OCAML_OPT_C_FLAGS = -dtypes
OCAML_LD = $(OCAML_C) -g
OCAML_OPT_LD = $(OCAML_OPT_C) -p
else
ifndef DEBUG
OCAML_C_FLAGS = -dtypes
OCAML_OPT_C_FLAGS = -dtypes
OCAML_LD = $(OCAML_C) -g
OCAML_OPT_LD = $(OCAML_OPT_C)
else
OCAML_C_FLAGS = -dtypes
OCAML_OPT_C_FLAGS = -dtypes
OCAML_LD = $(OCAML_C) -g
OCAML_OPT_LD = $(OCAML_OPT_C)
endif
endif
OCAML_MKTOP = ocamlmktop
OCAML_CP = ocamlcp
OCAML_DEP = ocamldep
OCAML_Lex = ocamllex
OCAML_YACC = ocamlyacc
OCAML_C_CPP_INC = -I $(Shell $(OCAML_C) -v | tail -1 | sed -e \
's/^Standard library directory: //')
私が得ているエラーは次のとおりです。
ld: symbol(s) not found for architecture x86_64
完全な出力は次のとおりです。
make
Linking OCAML (top level) program nanoml.top
ocamlmktop -o nanoml.top -custom nano.cmo nanoLex.cmo nanoParse.cmo main.cmo \
-cc g++ -cclib ' '
/var/folders/n3/jgblhwmj40lchgq71bmgr8sw0000gn/T/camlprimbd6a63.c:784: warning: deprecated conversion from string constant to ‘char*’
.
. //The same line ALOT of times. Removed due to limit of chars in a single post.
.
/var/folders/n3/jgblhwmj40lchgq71bmgr8sw0000gn/T/camlprimbd6a63.c:784: warning: deprecated conversion from string constant to ‘char*’
ld: warning: ignoring file /usr/local/lib/ocaml/libcamlrun.a, file was built for archive which is not the architecture being linked (x86_64)
Undefined symbols for architecture x86_64:
"_main", referenced from:
start in crt1.10.6.o
"_caml_alloc_dummy", referenced from:
_caml_builtin_cprim in ccZbZ9Mf.o
.
. //And many of these lines
.
"_caml_get_exception_backtrace", referenced from:
_caml_builtin_cprim in ccZbZ9Mf.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
File "_none_", line 1, characters 0-1:
Error: Error while building custom runtime system
make: *** [nanoml.top] Error 2
前もって感謝します!
編集:私はOcamlのみを使用しています。リンクする必要のあるC++やCはありません。私はこれまでmakefileでocamlコードを実行しようとしたことがありませんが、このコンピューターで他のocamlコードを実行できます。失敗するのはこれが初めてですが、メイクファイルを使用するのは初めてです。
また、同じmakefileとコードが他のマシン(古いマシンでも)でも機能するので、64ビットを使用するこのマシンと関係があると思います。
次のような別のmakefileが与えられていることがわかりました。
# Generic compilation rules
%.o : %.c
@echo Compiling C file $<
$(C_C) $(C_CPP_FLAGS) $(C_CPP_INCLUDES) -c $< -o $@
%.o : %.cc
@echo Compiling C++ file $<
$(CPP_C) $(C_CPP_FLAGS) $(C_CPP_INCLUDES) -c $< -o $@
%.o : %.cpp
@echo Compiling C++ file $<
$(CPP_C) $(C_CPP_FLAGS) $(C_CPP_INCLUDES) -c $< -o $@
%.cmi: %.mli
@echo Compiling OCAML interface $<
$(OCAML_C) $(OCAML_C_FLAGS) $(OCAML_INCLUDES) -c $< -o $@
%.cmo: %.ml
@echo Compiling \(to byte code\) OCAML module $<
$(OCAML_C) $(OCAML_C_FLAGS) $(OCAML_INCLUDES) -c $< -o $@
%.cmx: %.ml
@echo Compiling \(to native code\) OCAML module $<
$(OCAML_OPT_C) $(OCAML_OPT_C_FLAGS) $(OCAML_INCLUDES) -c $< -o $@
%.ml: %.mll
@echo Lexing OCAML file $<
$(OCAML_Lex) $<
%.ml %.mli: %.mly
@echo Yaccing OCAML file $<
$(OCAML_YACC) $<
# Generic cleaning rules
default-clean:
rm -f *~ *.o *.cmo *.cmx .*.depend *.cmi
.PHONY: default-clean
# Generic link rules and library creation rules
#
# These rules assume that the following variables are set (when necessary):
#
# - C_EXE : name of the C executable
# - CPP_EXE : name of the C++ executable
# - OCAML_EXE : name of the OCaml executable (without suffix)
# - OCAML_TPL_EXE : name of the OCaml custom toplevel (without suffix)
# - C_CPP_LIB : name of the C/C++ library
# - OCAML_LIB : name of the OCaml library (without suffix)
# - C_CPP_EXE_OBJ : list of C/C++ objects (without suffix) to build exe
# - OCAML_EXE_OBJ : list of OCaml modules (without suffix) to build exe
# - C_CPP_LIB_OBJ : list of C/C++ objects (without suffix) to build lib
# - OCAML_LIB_OBJ : list of OCaml modules (without suffix) to build lib
# - C_CPP_LD_FLAGS : C and C++ linker flags
# - OCAML_LD_FLAGS : OCaml linker (both native and bytecode) flags
# - C_CPP_LD_LIBS : C and C++ linker libraries
# - OCAML_LD_LIBS : OCaml linker (both native and bytecode) libraries
ifdef C_EXE
$(C_EXE): $(C_CPP_EXE_OBJ:%=%.o)
@echo Linking C program $@
$(C_LD) $(C_CPP_LD_FLAGS) -o $@ $(C_CPP_EXE_OBJ:%=%.o) $(C_CPP_LD_LIBS)
endif
ifdef CPP_EXE
$(CPP_EXE): $(C_CPP_EXE_OBJ:%=%.o)
@echo Linking C++ program $@
$(CPP_LD) $(C_CPP_LD_FLAGS) -o $@ $(C_CPP_EXE_OBJ:%=%.o) $(C_CPP_LD_LIBS)
endif
ifdef C_CPP_LIB
$(C_CPP_LIB).a: $(C_CPP_LIB_OBJ:%=%.o)
@echo Creating C/C++ library $@
$(AR) r $@ $?
$(RANLIB) $@
endif
ifdef OCAML_EXE
$(OCAML_EXE).byte: $(C_CPP_EXE_OBJ:%=%.o) $(OCAML_EXE_OBJ:%=%.cmo)
@echo Linking OCAML \(byte code\) program $@
$(OCAML_LD) $(OCAML_LD_FLAGS) -o $@ -custom $(OCAML_LD_LIBS:%=%.cma) $(C_CPP_EXE_OBJ:%=%.o) $(OCAML_EXE_OBJ:%=%.cmo) \
-cc $(CPP_C) -cclib '$(C_CPP_LD_FLAGS) $(C_CPP_LD_LIBS)'
$(OCAML_EXE).opt: $(C_CPP_EXE_OBJ:%=%.o) $(OCAML_EXE_OBJ:%=%.cmx)
@echo Linking OCAML \(native code\) program $@
$(OCAML_OPT_LD) $(OCAML_LD_FLAGS) -o $@ $(OCAML_LD_LIBS:%=%.cmxa) $(C_CPP_EXE_OBJ:%=%.o) $(OCAML_EXE_OBJ:%=%.cmx) \
-cc $(CPP_C) -cclib '$(C_CPP_LD_FLAGS) $(C_CPP_LD_LIBS)'
$(OCAML_EXE).top: $(C_CPP_EXE_OBJ:%=%.o) $(OCAML_EXE_OBJ:%=%.cmo)
@echo Linking OCAML \(top level\) program $@
$(OCAML_MKTOP) $(OCAML_LD_FLAGS) -o $@ -custom $(OCAML_LD_LIBS:%=%.cma) $(C_CPP_EXE_OBJ:%=%.o) $(OCAML_EXE_OBJ:%=%.cmo) \
-cc $(CPP_C) -cclib '$(C_CPP_LD_FLAGS) $(C_CPP_LD_LIBS)'
endif
ifdef OCAML_TPL_EXE
$(OCAML_TPL_EXE).byte: $(C_CPP_EXE_OBJ:%=%.o) $(OCAML_EXE_OBJ:%=%.cmo)
@echo Linking OCAML \(byte code\) toplevel $@
$(OCAML_MKTOP) $(OCAML_LD_FLAGS) -o $@ -custom $(OCAML_LD_LIBS:%=%.cma) $(C_CPP_EXE_OBJ:%=%.o) $(OCAML_EXE_OBJ:%=%.cmo) \
-cc $(CPP_C) -cclib '$(C_CPP_LD_FLAGS) $(C_CPP_LD_LIBS)'
endif
ifdef OCAML_LIB
$(OCAML_LIB).cma: $(OCAML_LIB_OBJ:%=%.cmo)
@echo Creating OCAML \(byte code\) library $@
$(OCAML_LD) $(OCAML_LD_FLAGS) -a -o $@ $(OCAML_LIB_OBJ:%=%.cmo)
$(OCAML_LIB).cmxa $(OCAML_LIB).a: $(OCAML_LIB_OBJ:%=%.cmx)
@echo Creating OCAML \(native code\) library $@
$(OCAML_OPT_LD) $(OCAML_LD_FLAGS) -a -o $@ $(OCAML_LIB_OBJ:%=%.cmx)
endif
ifdef OCAML_CINTF
ifdef OCAML_BYTECODE_CINTF
$(OCAML_CINTF).o: $(OCAML_CINTF_OBJ:%=%.cmo)
@echo Creating OCAML \(native code\) C interface library $@
$(OCAML_LD) $(OCAML_LD_FLAGS) -output-obj -o $@ $(OCAML_LD_LIBS:%=%.cma) $(OCAML_CINTF_OBJ:%=%.cmo)
$(OCAML_CINTF_LIB).a: $(OCAML_CINTF).o $(C_CPP_CINTF_OBJ:%=%.o)
@echo Creating C/C++ interface library $@
$(AR) r $@ $?
$(RANLIB) $@
else
$(OCAML_CINTF).o: $(OCAML_CINTF_OBJ:%=%.cmx)
@echo Creating OCAML \(native code\) C interface library $@
$(OCAML_OPT_LD) $(OCAML_LD_FLAGS) -output-obj -o $@ $(OCAML_LD_LIBS:%=%.cmxa) $(OCAML_CINTF_OBJ:%=%.cmx)
$(OCAML_CINTF_LIB).a: $(OCAML_CINTF).o $(C_CPP_CINTF_OBJ:%=%.o)
@echo Creating C/C++ interface library $@
$(AR) r $@ $?
$(RANLIB) $@
endif
endif
# Generic dependencies creation rules
.%.mli.depend: %.mli
@echo Generating dependencies for OCAML interface $<
$(OCAML_DEP) $< > $@
.%.ml.depend: %.ml
@echo Generating dependencies for OCAML module $<
$(OCAML_DEP) $< > $@
面白いラインは
ld:警告:ファイル/usr/local/lib/ocaml/libcamlrun.aを無視し、リンクされているアーキテクチャではないアーカイブ用にファイルがビルドされました(x86_64)
それはあなたのocamlランタイムがあなたが必要とする64ビットではなくおそらく32ビットライブラリであることをあなたに伝えます。
G ++の「-m32」フラグを試して、すべてを32ビットでコンパイルするか、64ビットバージョンのocamlをインストールすることをお勧めします。
OCamlコンパイラが32ビットの実行可能ファイルを生成しているようです。伝える方法の1つは、次のように言うことです。
$ ocamlopt -config
architecture i386
が表示されている場合、それは32ビットコンパイラです。 architecture AMD64
が表示されている場合、それは64ビットコンパイラです。とにかく、これらは私のMacbookProに見られる2つの異なる値です。
編集
あなたが与えるMakefile
は、あなたがやろうとしていることを実際には説明していません。一部の言語プロセッサの名前を定義するだけです。実際のMakefile
はおそらく他の場所にあります。
Makefile
は実際にはあなたがしていることについて何も言っていないので、あなたがOCamlとC++(またはC)を一緒にリンクしているという証拠が見当たらないことに気づきました。出力の最初の行には、OCamlファイルのように見えるもの以外は何も表示されません。さらに、それらはxyz.cmo
という名前で、bytecodeOCamlファイルです。つまり、32ビットまたは64ビット(ネイティブ)ファイルではありません。
一緒にリンクする必要があるいくつかのC++といくつかのOCamlコンポーネントがありますか、それともプロジェクトは純粋なOCamlですか?純粋なOCamlの場合、問題はすべてMakefile
にあると思います。 OCamlコードを実行したいだけなら、アーキテクチャについて心配する必要はありません。
C++またはCがある場合は、それを-Arch i386
(32ビットオブジェクトを取得するため)でコンパイルしてから、32ビットを生成していることを認識しているリンカー(ld
)ですべてをリンクする必要があります。ビットターゲット。 (または、Fabrice Le Fessantが言うように、64ビットのOCaml complerをインストールすることもできます。)
考えられる提案は、小さなOCamlファイルを作成し、それをコンパイルして実行できるかどうかを確認することです。
バイトコードコンパイラを使用すると、次のようになります。
$ uname -rs
Darwin 10.8.0
$ cat tiny.ml
Printf.printf "hello world\n"
$ ocamlc -o tiny tiny.ml
$ file tiny.cmo
tiny.cmo: Objective caml object file (.cmo) (Version 006).
$ file tiny
tiny: a /sw/bin/ocamlrun script text executable
$ tiny
hello world
ネイティブ32ビットコンパイラを使用すると、次のようになります。
$ ocamlopt -o tiny tiny.ml
$ file tiny.cmx
tiny.cmx: Objective caml native object file (.cmx) (Version 011).
$ file tiny.o
tiny.o: Mach-O object i386
$ file tiny
tiny: Mach-O executable i386
$ tiny
hello world
編集2
2番目のmakefileには、特に何をしようとしているのかがまだ表示されていません。さまざまなタイプの実行可能ファイルをコンパイルおよびリンクするためのいくつかのmakeルールを定義するだけです。ただし、プロジェクトはすべてOCamlであると言うので、問題全体がこのMakefileにあると言えます。
問題は、このMakefileが、-cc
および-cclib
オプションを使用して、OCamlコンパイラがバックエンドとして使用するCコンパイラとライブラリを指定していることであるように思われます。ほとんどのシステムでは、OCamlのバックエンドとして標準のCコンパイラを指定するだけで問題なく動作します。 Mac OS Xでは、32ビット/ 64ビットのアーキテクチャ上の問題があります。このMakefileがなくてもOCamlを正常にコンパイルできるので、OCamlコンパイラはOCamlプログラムをコンパイルしてリンクする方法をすでに知っていることをお勧めします。したがって、Makefileから-cc
および-cclib
オプションを削除してみてください。
これを行うには:OCAML_EXE
の下の3つのセクションすべてで、3番目の行(-cc
と-cclib
の行)を完全に削除し、末尾の円記号を削除します前の行。
Gphoto2をコンパイルしようとしている間、私は過去2日間この問題を抱えています。最近、OS X10.8からOSX10.9にアップグレードしました。最初は、新しいXCodeバージョンとコマンドラインツールで問題が発生したのではないかと思いました。
私はすべてを更新することを確認しましたが、ocamlのアーキテクチャの不整合はまだ残っていたので、自作バージョンのocamlをインストールすることにしました。
$ brew install ocaml
etvoilà