web-dev-qa-db-fra.com

gcc ld: symbole (s) non trouvé (s) pour l'architecture x86_64

Bon alors je fais un lexer et un analyseur utilisant Ocamlyacc. J'ai fait mes recherches et je pense que c'est quelque chose à voir avec mon makefile qui ne sélectionne pas la bonne version de bit pour mon compilateur ou quelque chose du genre? Je ne connais pas grand chose aux makefiles, c'est pourquoi je pose la question. 

J'ai exécuté mon programme sur un autre ordinateur où il fonctionne sans problème, donc il doit y avoir quelque chose à voir avec ma machine.

C'est un MacBook Pro 64 bits. J'utilise Xcode 4.2.1. 

Voici le 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: //')

L'erreur que je reçois est la suivante:

ld: symbol(s) not found for architecture x86_64

Voici la sortie complète:

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

Merci d'avance!

EDIT: Je n’utilise que Ocaml. Pas de C++ ou C qui doit être lié à cela. Je n'ai jamais essayé d'exécuter mon code ocaml avec un fichier make auparavant, mais je peux exécuter un autre code ocaml sur cet ordinateur. C'est la première fois que cela échoue, mais c'est la première fois que j'utilise un fichier makefile.

Et le même makefile et le même code fonctionnent sur d’autres machines (bien que les anciennes machines), donc je pense que cela a quelque chose à voir avec celle-ci qui utilise 64 bits.

J'ai trouvé qu'on me donnait un autre fichier Make qui ressemble à ceci:

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

La ligne intéressante est 

ld: avertissement: en ignorant le fichier /usr/local/lib/ocaml/libcamlrun.a, le fichier était construit pour une archive qui n'est pas l'architecture reliée (x86_64).

Il vous indique que votre environnement d'exécution ocaml est probablement une bibliothèque 32 bits, au lieu de Les 64 bits dont vous avez besoin.

Vous voudrez peut-être essayer l'indicateur "-m32" de g ++ pour tout compiler en 32 bits, ou pour installer une version 64 bits d'ocaml.

10
Fabrice Le Fessant

Il semble que votre compilateur OCaml produise des exécutables 32 bits. Une façon de le dire est de dire:

$ ocamlopt -config

Si vous voyez architecture i386, c'est un compilateur 32 bits. Si vous voyez architecture AMD64, c'est un compilateur 64 bits. Quoi qu'il en soit, ce sont les deux valeurs différentes que je vois sur mon Macbook Pro.

Modifier

La Makefile que vous donnez ne décrit pas vraiment ce que vous essayez de faire. Il ne fait que définir les noms de certains processeurs de langage. La vraie Makefile est peut-être ailleurs.

Puisque la variable Makefile ne dit rien de ce que vous faites, j'ai compris que je ne voyais aucune preuve montrant que vous reliez OCaml et C++ (ou C) ensemble. La première ligne de sortie ne montre rien sauf ce qui ressemble à des fichiers OCaml. De plus, ils sont Nommés xyz.cmo, qui sont des fichiers bytecode OCaml. C'est-à-dire qu'ils ne sont pas des fichiers 32 bits ou 64 bits (natifs).

Avez-vous des composants C++ et OCaml à associer, ou votre projet est-il pur OCaml? Si c'est pur OCaml, je dirais que le problème est dans la Makefile. Vous ne devriez pas avoir à vous soucier de l'architecture si vous voulez juste exécuter du code OCaml.

S'il y a du C++ ou du C, vous devez le compiler avec -Arch i386 (pour obtenir des objets 32 bits), puis lier le tout avec un éditeur de liens (ld) sachant qu'il génère une cible 32 bits. (Ou, comme le dit Fabrice Le Fessant, vous pourriez installer un complément OCaml 64 bits.)

Une suggestion possible est de créer un petit fichier OCaml et de voir si vous pouvez le compiler et l'exécuter.

En utilisant le compilateur de bytecode, cela ressemble à ceci:

$ 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

En utilisant un compilateur natif 32 bits, cela ressemble à ceci:

$ 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

Modifier 2

Votre deuxième fichier make ne montre toujours pas ce que vous essayez de faire, en particulier. Il ne fait que définir des règles de création pour la compilation et la liaison de différents types d’exécutables. Cependant, puisque vous dites que votre projet est entièrement en OCaml, je dirais que tout le problème réside dans ce Makefile.

Le problème semble être que ce Makefile spécifie le compilateur C et les bibliothèques que le compilateur OCaml doit utiliser comme back-end, en utilisant les options -cc et -cclib. Sur la plupart des systèmes, il suffira de spécifier le compilateur C standard comme back-end pour OCaml. Sur Mac OS X, il existe des complications architecturales 32 bits/64 bits. Comme vous pouvez compiler OCaml avec succès sans ce Makefile, je suggérerais que le compilateur OCaml sache déjà comment compiler et lier des programmes OCaml. Vous pouvez donc essayer simplement de supprimer les options -cc et -cclib du Makefile.

Pour ce faire: Dans les trois sections sous OCAML_EXE, supprimez entièrement la troisième ligne (la ligne avec -cc et -cclib) et supprimez la barre oblique inverse à la fin de la ligne précédente .

4
Jeffrey Scofield

Je rencontre ce problème depuis deux jours en essayant de compiler gphoto2. Je viens de mettre à niveau d'OS X 10.8 à OS X 10.9. Au début, je pensais que la nouvelle version de XCode et les outils de ligne de commande auraient posé problème.

Je me suis assuré de tout mettre à jour, mais l'incohérence de l'architecture sur ocaml était toujours là, alors j'ai décidé d'installer la version homebrew de ocaml:

$ brew install ocaml

et voilà

0
tin