2012-02-14 15 views
9

ठीक है इसलिए मैं ओकैक्लिक का उपयोग कर एक लेजर और पार्सर बना रहा हूं। मैंने अपना शोध किया है और मुझे लगता है कि यह मेरे मेकफ़ाइल के साथ कुछ करने के लिए कुछ है जो मेरे कंपाइलर के लिए सही संस्करण नहीं चुन रहा है या ऐसा कुछ है? मैं मेकफ़ाइल के बारे में ज्यादा नहीं जानता, इसलिए मैं पूछ रहा हूं।जीसीसी एलडी: आर्किटेक्चर के लिए प्रतीक नहीं मिला x86_64

मैंने अपना प्रोग्राम किसी अन्य कंप्यूटर पर चलाया है जहां यह बिना किसी परेशानी के काम करता है, इसलिए यह मेरी मशीन के साथ कुछ करना होगा।

यह एक मैकबुक प्रो 64 बिट है। मैं एक्सकोड 4.2.1 का उपयोग कर रहा हूँ।

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 

अग्रिम धन्यवाद

यहाँ makefile है!

संपादित करें: मैं केवल ओकंपल का उपयोग कर रहा हूं। कोई सी ++ या सी जिसे इसके साथ लिंक करने की आवश्यकता नहीं है। मैंने पहले कभी भी मेकफ़ाइल के साथ अपना ओकंपल कोड चलाने की कोशिश नहीं की है, लेकिन मैं इस कंप्यूटर पर अन्य ओकंपल कोड चला सकता हूं। यह पहली बार विफल रहता है लेकिन यह पहली बार है जब मैं मेकफ़ाइल का उपयोग करता हूं।

और वही मेकफ़ाइल और कोड अन्य मशीनों (हालांकि पुरानी मशीनों) पर काम करता है, इसलिए मुझे लगता है कि 64 बिट्स का उपयोग करके इसका कुछ संबंध है।

मैंने पाया मैं एक makefile जो इस तरह दिखता दिया गया है:

# 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] 

उत्तर

4

यह हो सकता है आपके OCaml संकलक 32-बिट निष्पादनयोग्य का निर्माण कर रहा है की तरह लग रहा है।

$ ocamlopt -config 

आप architecture i386 देखते हैं, तो एक 32-बिट संकलक है: एक ही रास्ता बताने के लिए कहने के लिए है। यदि आप architecture amd64 देखते हैं, तो यह 64-बिट कंपाइलर है। किसी भी दर पर, ये मेरे मैकबुक प्रो पर दो अलग-अलग मान हैं I

संपादित

Makefile तुम सच में वर्णन नहीं है तुम क्या करने की कोशिश कर रहे हैं क्या दे। यह सिर्फ कुछ भाषा प्रोसेसर के लिए नाम परिभाषित करता है। वास्तविक Makefile संभवतः कहीं और है।

चूंकि Makefile वास्तव में आपके द्वारा किए जा रहे कार्यों के बारे में कुछ भी नहीं कहता है, मुझे एहसास हुआ कि मुझे कोई सबूत नहीं दिख रहा है कि आप ओकैमल और सी ++ (या सी) को एक साथ जोड़ रहे हैं। आउटपुट की पहली पंक्ति ओकैम फाइलों की तरह दिखने के अलावा कुछ भी नहीं दिखाती है। इसके अलावा, वे नाम xyz.cmo हैं, जो बाइटकोड OCaml फ़ाइलें हैं। यही है, वे 32-बिट या 64-बिट (मूल) फ़ाइलें नहीं हैं।

क्या आपके पास कुछ सी ++ और कुछ ओकैमल घटक हैं जिन्हें एक साथ जोड़ने की आवश्यकता है, या आपकी परियोजना शुद्ध ओकैमल है? यदि यह शुद्ध ओकैमल है, तो मैं कहूंगा कि समस्या Makefile में है। यदि आप ओकैमल कोड को चलाने के लिए चाहते हैं तो आपको आर्किटेक्चर के बारे में चिंता करने की ज़रूरत नहीं है।

अगर वहाँ कुछ सी ++ या सी है, तो आप -arch i386 के साथ संकलित करने के लिए (32-बिट वस्तुओं को पाने के लिए) सब कुछ एक साथ जोड़ने के लिए एक संयोजक (ld) जानता है कि यह एक 32-बिट लक्ष्य के उत्पादन के साथ की जरूरत है और उसके बाद। (या, जैसा कि फैब्रिस ले फेसेन्ट कहते हैं, आप 64-बिट ओकैमल शिकायत स्थापित कर सकते हैं।)

एक संभावित सुझाव है कि एक छोटी ओकैम फ़ाइल बनाएं और बस देखें कि आप इसे संकलित और चला सकते हैं या नहीं।

बाईटकोड संकलक का उपयोग करना, यह इस तरह दिखता है:

$ 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

आपका दूसरी मेकफ़ाइल अभी भी वह नहीं दिखाती है जो आप करने की कोशिश कर रहे हैं, विशेष रूप से। यह सिर्फ विभिन्न प्रकार के निष्पादन योग्यों को संकलित और जोड़ने के लिए नियम बनाने के नियमों को परिभाषित करता है। हालांकि, चूंकि आप कहते हैं कि आपकी परियोजना सभी ओकैमल है, तो मैं कहूंगा कि पूरी समस्या इस मेकफ़ाइल में है।

समस्या यह है कि इस Makefile निर्दिष्ट करता है जो सी संकलक और पुस्तकालयों OCaml संकलक, इसके पीछे के अंत के रूप में उपयोग -cc और -cclib विकल्पों का उपयोग करना चाहिए प्रतीत होता है। अधिकांश प्रणालियों पर, यह ओसीएमएल के लिए बैक-एंड के रूप में मानक सी कंपाइलर निर्दिष्ट करने के लिए ठीक काम करेगा। मैक ओएस एक्स पर, 32-बिट/64-बिट आर्किटेक्चरल जटिलताओं हैं। चूंकि आप इस मेकफ़ाइल के बिना ओकैम सफलतापूर्वक संकलित कर सकते हैं, इसलिए मैं सुझाव दूंगा कि ओकैमल कंपाइलर पहले ही जानता है कि ओकैमल प्रोग्राम कैसे संकलित और लिंक करें। तो आप मेकफ़ाइल से -cc और -cclib विकल्पों को हटाने का प्रयास कर सकते हैं।

ऐसा करने के लिए: OCAML_EXE के तहत सभी तीन वर्गों में तीसरी लाइन पूरी तरह से (-cc और -cclib के साथ लाइन) को हटाने, और पिछली लाइन पर अनुगामी बैकस्लैश को हटा दें।

+0

हाँ मैं देख रहा हूँ i386 एक तो यह है 32 बिट कंपाइलर।मैं 64 के बजाय 32 बिट्स में अपना जी ++/जीसीसी कंपाइलर कैसे चला सकता हूं? –

+0

'सीसी-मार्च i386' मेरे लिए काम करता है। –

+0

मैंने "gcc -arch i386" और "gcc -arch amd64" दोनों के साथ प्रयास किया है। दोनों में परिणाम: "ld: चेतावनी: फ़ाइल /usr/local/lib/ocaml/libcamlrun.a को अनदेखा कर, फ़ाइल संग्रह के लिए बनाया गया था जो आर्किटेक्चर को लिंक नहीं किया जा रहा है (x86_64)"। –

10

दिलचस्प लाइन है

ld: चेतावनी: फ़ाइल /usr/local/lib/ocaml/libcamlrun.a अनदेखी, फ़ाइल संग्रह के लिए बनाया गया है जो वास्तुकला (x86_64)

जोड़ा जा रहा है नहीं है था

यह आपको बताता है कि आपकी ओकंपल रनटाइम शायद 32 बिट्स लाइब्रेरी है, आपको 64 बिट्स की आवश्यकता है।

आप 32 बिट्स में सबकुछ संकलित करने के लिए या ओकंपल के 64 बिट संस्करण को स्थापित करने के लिए g ++ के "-m32" ध्वज को आजमा सकते हैं।

+0

मैं अपने मेकफ़ाइल पर उस ध्वज को वास्तव में कैसे लागू करूं? मुझे मेकफ़ाइल के बारे में कुछ भी पता नहीं है और मैंने कोशिश की है –

+0

आपको अधिक समझने की आवश्यकता नहीं है, यह जानने का प्रयास करें कि "-cc g ++" टेक्स्ट कहां स्थित है (या बस -cc), और "g ++" को g ++ में बदलें - M32 ' "। –

+2

मैंने अभी यह किया है (ओकंप से संबंधित नहीं है लेकिन ओपी के समान त्रुटि है) और यह 'ld: प्रतीक (ओं) आर्किटेक्चर i386' के लिए नहीं मिला: डी: डी: डी – mraaroncruz

0

मुझे gphoto2 संकलित करने की कोशिश करते समय पिछले दो दिनों से यह समस्या हो रही है। मैंने अभी हाल ही में ओएस एक्स 10.8 से ओएस एक्स 10.9 में अपग्रेड किया है। पहले मैंने सोचा कि यह नए एक्सकोड संस्करण और कमांड लाइन टूल्स पर समस्याएं होगी।

मैं लेकिन ocaml पर वास्तुकला विसंगति अभी भी वहाँ तो था सब कुछ अद्यतन करने के लिए सुनिश्चित किया है, मैं ocaml की homebrew संस्करण को स्थापित करने का निर्णय लिया:

$ brew install ocaml 

एट देखा

संबंधित मुद्दे