2012-02-14 32 views
9

Đượ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] 

Trả lời

4

Dường như có thể biên dịch OCaml của bạn được sản xuất thực thi 32-bit. Một cách để nói là nói:

$ ocamlopt -config 

Nếu bạn thấy architecture i386, đó là trình biên dịch 32 bit. Nếu bạn thấy architecture amd64, đó là trình biên dịch 64 bit. Dù sao, đây là hai giá trị khác nhau mà tôi thấy trên Macbook Pro của tôi.

Sửa

Các Makefile bạn đưa ra không thực sự mô tả những gì bạn đang cố gắng để làm. Nó chỉ định nghĩa tên cho một số bộ xử lý ngôn ngữ. Makefile thực có thể ở nơi khác.

Makefile không thực sự nói gì về những gì bạn đang làm, tôi nhận ra rằng tôi không thấy bất kỳ bằng chứng nào cho thấy bạn đang liên kết OCaml và C++ (hoặc C) với nhau. Dòng đầu tiên của đầu ra không hiển thị bất cứ điều gì ngoại trừ những gì trông giống như các tập tin OCaml. Hơn nữa, chúng là có tên xyz.cmo, là bytecode tệp OCaml. Tức là, chúng không phải là các tệp 322 bit hoặc 64 bit (bản địa).

Bạn có một số C++ và một số thành phần OCaml cần được liên kết với nhau hoặc dự án OCaml thuần túy của bạn không? Nếu đó là OCaml tinh khiết, tôi muốn nói vấn đề là tất cả trong Makefile. Bạn không cần phải lo lắng về kiến ​​trúc nếu bạn chỉ muốn chạy mã OCaml.

Nếu có một số C++ hoặc C, thì bạn cần biên dịch nó với -arch i386 (để nhận các đối tượng 32 bit) và sau đó liên kết mọi thứ cùng với một trình liên kết (ld) biết nó đang tạo ra một mục tiêu 32 bit. (Hoặc, như Fabrice Le Fessant nói, bạn có thể cài đặt bộ biên dịch OCaml 64 bit.)

Một gợi ý có thể là tạo một tệp OCaml nhỏ và chỉ xem bạn có thể biên dịch và chạy nó hay không.

Sử dụng trình biên dịch bytecode, nó trông như thế này:

$ 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 

Sử dụng một trình biên dịch 32-bit bản địa, nó trông như thế này:

$ 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 

Chỉnh sửa 2

của bạn makefile thứ hai vẫn không hiển thị những gì bạn đang cố gắng làm, cụ thể. Nó chỉ định nghĩa một số quy tắc để biên dịch và liên kết các kiểu thực thi khác nhau. Tuy nhiên, kể từ khi bạn nói dự án của bạn là tất cả OCaml, sau đó tôi muốn nói toàn bộ vấn đề là trong Makefile này.

Vấn đề có vẻ là Makefile này chỉ định trình biên dịch C và thư viện nào mà trình biên dịch OCaml nên sử dụng làm phần cuối của nó, sử dụng các tùy chọn -cc-cclib. Trên hầu hết các hệ thống, nó sẽ làm việc OK để chỉ định trình biên dịch C chuẩn làm back-end cho OCaml. Trên Mac OS X, có các biến chứng kiến ​​trúc 32 bit/64 bit. Vì bạn có thể biên dịch OCaml thành công mà không có Makefile này, tôi đề nghị trình biên dịch OCaml đã biết cách biên dịch và liên kết các chương trình OCaml. Vì vậy, bạn có thể thử chỉ cần xóa các tùy chọn -cc-cclib khỏi Makefile.

Để làm điều này: Trong tất cả ba phần dưới OCAML_EXE loại bỏ dòng thứ ba hoàn toàn (đường với -cc-cclib), và loại bỏ các dấu chéo ngược trailing trên dòng trước.

+0

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? –

+0

'cc -arch i386' hoạt động cho tôi. –

+0

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)". –

10

Dòng thú vị là

ld: cảnh báo: bỏ qua tập tin /usr/local/lib/ocaml/libcamlrun.a, tập tin được xây dựng để lưu trữ mà không phải là kiến ​​trúc được liên kết (x86_64)

Nó cho bạn biết thời gian chạy ocaml của bạn có thể là thư viện 32 bit, thay vì 64 bit bạn cần.

Bạn có thể muốn thử cờ "-m32" của g ++ để biên dịch mọi thứ trong 32 bit hoặc cài đặt phiên bản 64 bit của ocaml.

+0

chính xác như thế nào để áp dụng cờ đó vào makefile của tôi? Tôi không biết gì về makefiles và những gì tôi đã cố gắng thất bại –

+0

Bạn không cần phải hiểu nhiều, cố gắng tìm nơi văn bản "-cc g ++" được đặt (hoặc chỉ -cc) và thay đổi "g ++" thành "g ++ - m32 '". –

+2

Tôi chỉ làm điều này (không liên quan đến ocaml nhưng lỗi tương tự như OP) và nhận được số này 'ld: (các) biểu tượng không tìm thấy cho kiến ​​trúc i386' : D: D: D – mraaroncruz

0

Tôi đã gặp sự cố này trong hai ngày qua trong khi cố gắng biên dịch gphoto2. Tôi vừa mới nâng cấp từ OS X 10.8 lên OS X 10.9. Lúc đầu, tôi nghĩ rằng nó sẽ là vấn đề về phiên bản XCode mới và các công cụ dòng lệnh.

Tôi chắc chắn để cập nhật tất cả mọi thứ nhưng kiến ​​trúc mâu thuẫn trên ocaml vẫn còn đó như vậy, tôi quyết định cài đặt phiên bản homebrew của ocaml:

$ brew install ocaml 

et thì đấy

Các vấn đề liên quan