gcc ld: symbol(s) not found for architecture x86_64

匿名 (未验证) 提交于 2019-12-03 02:24:01

问题:

Alright so I'm making a lexer and a parser using Ocamlyacc. I've done my research and I think it's something to do with my makefile not picking the right bit version for my compiler or something like it? I don't know much about makefiles which is why I'm asking.

I've run my program on another computer where it works without trouble so it gotta be something to do with my machine.

It's a MacBook Pro 64 bit. I'm using Xcode 4.2.1.

Here's the 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: //') 

The error that I'm getting is:

ld: symbol(s) not found for architecture x86_64 

Here's the full output:

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 

Thank you in advance!

EDIT: I'm only using Ocaml. No C++ or C that needs to be linked with it. I've never tried running my ocaml code with a makefile before but I can run other ocaml code on this computer. This is the first time it fails but it is the first time I use a makefile.

And the same makefile and code works on other machines(older machines though) so I think it has something to do with this one using 64 bits.

I found I've been given another makefile which looks like this:

# 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) $< > $@ 

回答1:

The interesting line is

ld: warning: ignoring file /usr/local/lib/ocaml/libcamlrun.a, file was built for archive which is not the architecture being linked (x86_64)

It tells you that your ocaml runtime is a probably a 32 bit library, instead of the 64 bits you need.

You might want to try the "-m32" flag of g++ to compile everything in 32 bits, or to install a 64 bit version of ocaml.



回答2:

It looks like maybe your OCaml compiler is producing 32-bit executables. One way to tell is to say:

$ ocamlopt -config 

If you see architecture i386, it's a 32-bit compiler. If you see architecture amd64, it's a 64-bit compiler. At any rate, these are the two different values I see on my Macbook Pro.

Edit

The Makefile you give doesn't really describe what you're trying to do. It just defines names for some language processors. The real Makefile is possibly elsewhere.

Since the Makefile doesn't actually say anything about what you're doing, I realized that I don't see any evidence that you're linking OCaml and C++ (or C) together. The first line of output doesn't show anything except what looks like OCaml files. Furthermore, they're named xyz.cmo, which are bytecode OCaml files. That is, they're not 32-bit or 64-bit (native) files.

Do you have some C++ and some OCaml components that need to be linked together, or is your project pure OCaml? If it's pure OCaml, I'd say the problem is all in the Makefile. You shouldn't have to worry about the architecture if you just want to run OCaml code.

If there's some C++ or C, then you need to compile it with -arch i386 (to get 32-bit objects) and then link everything together with a linker (ld) that knows it's producing a 32-bit target. (Or, as Fabrice Le Fessant says, you could install a 64-bit OCaml compler.)

A possible suggestion is to create a tiny OCaml file and just see if you can compile and run it.

Using the bytecode compiler, it looks like this:

$ 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 

Using a native 32-bit compiler, it looks like this:

$ 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 

Edit 2

Your second makefile still doesn't show what you're trying to do, specifically. It just defines some make rules for compiling and linking different types of executables. However, since you say your project is all OCaml, then I'd say the entire problem is in this Makefile.

The problem appears to be that this Makefile specifies which C compiler and libraries the OCaml compiler should use as its back-end, using the -cc and -cclib options. On most systems, it will work OK to just specify the standard C compiler as the back-end for OCaml. On Mac OS X, there are 32-bit/64-bit architectural complications. Since you can compile OCaml successfully without this Makefile, I'd suggest that the OCaml compiler already knows how to compile and link OCaml programs. So you might try just removing the -cc and -cclib options from the Makefile.

To do this: In all three sections under OCAML_EXE remove the third line entirely (the line with -cc and -cclib), and remove the trailing backslash on the previous line.



回答3:

I've been having this problem for the past two days while trying to compile gphoto2. I just recently upgraded from OS X 10.8 to OS X 10.9. At first I thought it would have been issues on the new XCode version and the command line tools.

I made sure to update everything but the architecture inconsistency on ocaml was still there so, I decided to install the homebrew version of ocaml:

$ brew install ocaml 

et voilà



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!