cha*_*aze 11 gcc ocaml makefile
好吧,所以我正在使用Ocamlyacc制作词法分析器和解析器.我已经完成了我的研究,我认为这与我的makefile有关,而不是为我的编译器选择正确的位版本或类似的东西?我不太了解makefile,这就是我要问的原因.
我在另一台计算机上运行我的程序,它可以毫无问题地工作,所以它必须与我的机器有关.
它是MacBook Pro 64位.我正在使用Xcode 4.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: //')
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
ld: symbol(s) not found for architecture x86_64
Run Code Online (Sandbox Code Playgroud)
这是完整的输出:
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
Run Code Online (Sandbox Code Playgroud)
先感谢您!
编辑:我只使用Ocaml.没有需要与之链接的C++或C. 我之前从未尝试使用makefile运行我的ocaml代码,但我可以在这台计算机上运行其他ocaml代码.这是第一次失败,但这是我第一次使用makefile.
并且相同的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) $< > $@
Run Code Online (Sandbox Code Playgroud)
Fab*_*ant 10
有趣的是
ld:警告:忽略文件/usr/local/lib/ocaml/libcamlrun.a,文件是为归档而构建的,而不是被链接的体系结构(x86_64)
它告诉您,您的ocaml运行时可能是32位库,而不是您需要的64位.
您可能想尝试使用g ++的"-m32"标志来编译32位的所有内容,或安装64位版本的ocaml.
看起来您的 OCaml 编译器可能正在生成 32 位可执行文件。一种说法是:
$ ocamlopt -config
Run Code Online (Sandbox Code Playgroud)
如果您看到architecture i386,则它是 32 位编译器。如果您看到architecture amd64,则它是 64 位编译器。无论如何,这是我在 Macbook Pro 上看到的两个不同的值。
编辑
您给出的内容Makefile并不能真正描述您想要做什么。它只是定义一些语言处理器的名称。真实的Makefile可能在别处。
由于Makefile实际上并没有说明您正在做什么,因此我意识到我没有看到任何证据表明您将 OCaml 和 C++(或 C)链接在一起。输出的第一行除了看起来像 OCaml 文件之外不显示任何内容。此外,它们被命名为xyz.cmo,它们是字节码OCaml 文件。也就是说,它们不是 32 位或64 位(本机)文件。
您是否有一些 C++ 和一些 OCaml 组件需要链接在一起,或者您的项目是纯 OCaml 的吗?如果它是纯 OCaml,我会说问题全部出在Makefile. 如果您只想运行 OCaml 代码,则不必担心架构。
如果有一些 C++ 或 C,那么您需要使用它进行编译-arch i386(以获取 32 位对象),然后ld使用知道它正在生成 32 位目标的链接器 ( ) 将所有内容链接在一起。(或者,正如 Fabrice Le Fessant 所说,您可以安装 64 位 OCaml 编译器。)
一个可能的建议是创建一个很小的 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
Run Code Online (Sandbox Code Playgroud)
使用本机 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
Run Code Online (Sandbox Code Playgroud)
编辑2
您的第二个 makefile 仍然没有具体显示您要做什么。它只是定义了一些用于编译和链接不同类型的可执行文件的 make 规则。然而,既然你说你的项目都是 OCaml,那么我想说整个问题都在这个 Makefile 中。
-cc问题似乎是这个 Makefile 使用和选项指定 OCaml 编译器应使用哪个 C 编译器和库作为其后端-cclib。在大多数系统上,只需指定标准 C 编译器作为 OCaml 的后端就可以正常工作。在 Mac OS X 上,存在 32 位/64 位架构复杂性。由于您可以在没有此 Makefile 的情况下成功编译 OCaml,因此我建议 OCaml 编译器已经知道如何编译和链接 OCaml 程序。因此,您可以尝试从 Makefile 中删除-cc和选项。-cclib
为此,请执行以下操作: 在下面的所有三个部分中完全删除第三行(带有和 的OCAML_EXE行),并删除上一行的尾部反斜杠。-cc-cclib