Được rồi, vì vậy tôi đang tạo một lexer và một trình phân tích cú pháp bằng Ocamlyacc. Tôi đã thực hiện nghiên cứu của tôi và tôi nghĩ rằng đó là một cái gì đó để làm với makefile của tôi không chọn phiên bản bit quyền cho trình biên dịch của tôi hoặc một cái gì đó như nó? Tôi không biết nhiều về makefiles đó là lý do tại sao tôi hỏi.gcc ld: không tìm thấy (các) biểu tượng cho kiến trúc x86_64
Tôi đã chạy chương trình của mình trên một máy tính khác nơi nó hoạt động mà không gặp sự cố, vì vậy, bạn phải làm gì đó với máy của mình.
Đó là MacBook Pro 64 bit. Tôi đang sử dụng Xcode 4.2.1.
Đây là 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: //')
Các lỗi mà tôi nhận được là:
ld: symbol(s) not found for architecture x86_64
Dưới đây là toàn bộ sản lượng:
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
Cảm ơn bạn trước!
CHỈNH SỬA: Tôi chỉ sử dụng Ocaml. Không có C++ hoặc C cần được liên kết với nó. Tôi đã không bao giờ cố gắng chạy mã ocaml của tôi với một makefile trước nhưng tôi có thể chạy mã ocaml khác trên máy tính này. Đây là lần đầu tiên nó thất bại nhưng đây là lần đầu tiên tôi sử dụng một makefile.
Và cùng một makefile và mã hoạt động trên các máy khác (máy cũ hơn) vì vậy tôi nghĩ rằng nó có cái gì để làm với điều này bằng cách sử dụng 64 bit.
tôi thấy tôi đã được trao một makefile mà trông như thế này:
# Generic compilation rules
%.o : %.c
@echo Compiling C file $<
$(C_C) $(C_CPP_FLAGS) $(C_CPP_INCLUDES) -c $< -o [email protected]
%.o : %.cc
@echo Compiling C++ file $<
$(CPP_C) $(C_CPP_FLAGS) $(C_CPP_INCLUDES) -c $< -o [email protected]
%.o : %.cpp
@echo Compiling C++ file $<
$(CPP_C) $(C_CPP_FLAGS) $(C_CPP_INCLUDES) -c $< -o [email protected]
%.cmi: %.mli
@echo Compiling OCAML interface $<
$(OCAML_C) $(OCAML_C_FLAGS) $(OCAML_INCLUDES) -c $< -o [email protected]
%.cmo: %.ml
@echo Compiling \(to byte code\) OCAML module $<
$(OCAML_C) $(OCAML_C_FLAGS) $(OCAML_INCLUDES) -c $< -o [email protected]
%.cmx: %.ml
@echo Compiling \(to native code\) OCAML module $<
$(OCAML_OPT_C) $(OCAML_OPT_C_FLAGS) $(OCAML_INCLUDES) -c $< -o [email protected]
%.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 [email protected]
$(C_LD) $(C_CPP_LD_FLAGS) -o [email protected] $(C_CPP_EXE_OBJ:%=%.o) $(C_CPP_LD_LIBS)
endif
ifdef CPP_EXE
$(CPP_EXE): $(C_CPP_EXE_OBJ:%=%.o)
@echo Linking C++ program [email protected]
$(CPP_LD) $(C_CPP_LD_FLAGS) -o [email protected] $(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 [email protected]
$(AR) r [email protected] $?
$(RANLIB) [email protected]
endif
ifdef OCAML_EXE
$(OCAML_EXE).byte: $(C_CPP_EXE_OBJ:%=%.o) $(OCAML_EXE_OBJ:%=%.cmo)
@echo Linking OCAML \(byte code\) program [email protected]
$(OCAML_LD) $(OCAML_LD_FLAGS) -o [email protected] -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 [email protected]
$(OCAML_OPT_LD) $(OCAML_LD_FLAGS) -o [email protected] $(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 [email protected]
$(OCAML_MKTOP) $(OCAML_LD_FLAGS) -o [email protected] -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 [email protected]
$(OCAML_MKTOP) $(OCAML_LD_FLAGS) -o [email protected] -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 [email protected]
$(OCAML_LD) $(OCAML_LD_FLAGS) -a -o [email protected] $(OCAML_LIB_OBJ:%=%.cmo)
$(OCAML_LIB).cmxa $(OCAML_LIB).a: $(OCAML_LIB_OBJ:%=%.cmx)
@echo Creating OCAML \(native code\) library [email protected]
$(OCAML_OPT_LD) $(OCAML_LD_FLAGS) -a -o [email protected] $(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 [email protected]
$(OCAML_LD) $(OCAML_LD_FLAGS) -output-obj -o [email protected] $(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 [email protected]
$(AR) r [email protected] $?
$(RANLIB) [email protected]
else
$(OCAML_CINTF).o: $(OCAML_CINTF_OBJ:%=%.cmx)
@echo Creating OCAML \(native code\) C interface library [email protected]
$(OCAML_OPT_LD) $(OCAML_LD_FLAGS) -output-obj -o [email protected] $(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 [email protected]
$(AR) r [email protected] $?
$(RANLIB) [email protected]
endif
endif
# Generic dependencies creation rules
.%.mli.depend: %.mli
@echo Generating dependencies for OCAML interface $<
$(OCAML_DEP) $< > [email protected]
.%.ml.depend: %.ml
@echo Generating dependencies for OCAML module $<
$(OCAML_DEP) $< > [email protected]
yea Tôi thấy i386 nên đó là một Trình biên dịch 32 bit.Làm cách nào để trình biên dịch g ++/gcc của tôi chạy trong 32 bit thay vì 64 bit? –
'cc -arch i386' hoạt động cho tôi. –
Tôi đã thử với cả "gcc -arch i386" và "gcc -arch amd64". Cả hai kết quả trong điều này: "ld: warning: bỏ qua tệp /usr/local/lib/ocaml/libcamlrun.a, tệp được tạo cho lưu trữ không phải là kiến trúc được liên kết (x86_64)". –