2012-02-14 90 views
9

好吧,我使用Ocamlyacc製作詞法分析器和解析器。我已經完成了我的研究,我認爲這與我的makefile沒有爲我的編譯器選擇正確的位版本或類似的東西有關?我不太瞭解makefile,這就是我問的原因。gcc ld:找不到架構x86_64的符號

我在另一臺電腦上運行我的程序,它沒有任何問題,所以它必須與我的機器有關。

這是一個MacBook Pro 64位。我正在使用Xcode 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 

預先感謝您!編輯: 我只使用Ocaml。沒有C++或C需要與它鏈接。我從來沒有試過用makefile運行我的ocaml代碼,但是我可以在這臺計算機上運行其他ocaml代碼。這是第一次失敗,但這是我第一次使用makefile。

而且相同的生成文件和代碼在其他機器上工作(儘管老機器),所以我認爲這與使用64位的這一個有關。

,我發現我已經給另一個生成文件看起來像這樣:

# 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位編譯器。無論如何,這些是我在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位對象),然後用它知道它的產生32位目標接頭(ld)聯繫在一起的一切。 (或者,正如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 

使用原生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,那麼我會說整個問題都在這個Makefile中。

問題似乎是這個Makefile指定OCaml編譯器應該使用哪個C編譯器和庫作爲它的後端,使用-cc-cclib選項。在大多數系統上,只需將標準C編譯器指定爲OCaml的後端即可。在Mac OS X上,存在32位/ 64位體系結構複雜性。由於你可以在沒有這個Makefile的情況下成功編譯OCaml,所以我建議OCaml編譯器已經知道如何編譯和鏈接OCaml程序。所以你可以嘗試從Makefile中刪除-cc-cclib選項。

要做到這一點:在OCAML_EXE下的所有三個區段除去第三行完全(用-cc-cclib線),和除去上一行尾部的反斜槓。

+0

啊,我看到的i386所以這是一個32位編譯器。如何讓我的g ++/gcc編譯器以32位而不是64位運行? – 2012-02-15 21:54:27

+0

'cc -arch i386'適合我。 – 2012-02-15 22:01:44

+0

我已經嘗試了「gcc -arch i386」和「gcc -arch amd64」。這兩個結果如下: 「ld:warning:忽略文件/usr/local/lib/ocaml/libcamlrun.a,該文件是爲歸檔而構建的,而不是被鏈接的體系結構(x86_64)」。 – 2012-02-16 04:54:47

10

有趣的線

LD:警告:忽略文件/usr/local/lib/ocaml/libcamlrun.a,文件是 歸檔內置這是不被鏈接(x86_64的)

架構

它告訴你,你的ocaml運行時間可能是一個32位庫,而不是你需要的64位的 。

您可能想要嘗試g ++的「-m32」標誌以32位編譯所有內容,或者安裝64位版本的ocaml。

+0

我該如何將該標誌應用於我的makefile?我對makefile一無所知,而且我嘗試失敗 – 2012-02-15 19:53:00

+0

你不需要了解太多,試着找到文本「-cc g ++」所在的位置(或者只是-cc),並將「g ++」改爲「'g ++ - M32' 」。 – 2012-02-16 09:09:11

+2

我只是做了這個(不是ocaml相關的,但是與OP相同的錯誤)並且得到了這個 'ld:symbol(s)not found for architecture i386' :D:D:D – mraaroncruz 2012-07-17 12:09:58

0

在試圖編譯gphoto2時,我在過去兩天裏一直有這個問題。我剛剛從OS X 10.8升級到OS X 10.9。起初,我認爲這將是新的XCode版本和命令行工具的問題。

我就確定更新的一切,但在ocaml的結構矛盾仍然存在的話,我決定安裝OCaml中的自制版本:

$ brew install ocaml 

等瞧

相關問題