gcc ld: символ (ы) не найден для архитектуры x86_64 - PullRequest
11 голосов
/ 14 февраля 2012

Хорошо, поэтому я делаю лексер и парсер, используя Ocamlyacc. Я провел исследование и думаю, что это связано с тем, что мой make-файл не выбрал правильную версию для моего компилятора или что-то в этом роде? Я не знаю много о make-файлах, поэтому я спрашиваю.

Я запустил свою программу на другом компьютере, где она работает без проблем, поэтому она должна быть как-то связана с моей машиной.

Это MacBook Pro 64 бит. Я использую Xcode 4.2.1.

Вот make-файл:

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

Заранее спасибо!

EDIT: Я использую только Ocaml. Нет C ++ или C, которые должны быть связаны с ним. Я никогда не пробовал запускать свой код ocaml с помощью make-файла, но я могу запустить другой код ocaml на этом компьютере. Это первый раз, когда он терпит неудачу, но это первый раз, когда я использую make-файл.

И тот же make-файл и код работают на других машинах (хотя и на более старых машинах), поэтому я думаю, что он как-то связан с этим, использующим 64 бита.

Я обнаружил, что мне дали другой make-файл, который выглядит так:

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

Ответы [ 3 ]

10 голосов
/ 14 февраля 2012

Интересная строка:

ld: предупреждение: игнорирование файла /usr/local/lib/ocaml/libcamlrun.a, файл создан для архива, который не связан с архитектурой (x86_64)

Это говорит о том, что ваша среда выполнения ocaml, вероятно, является 32-битной библиотекой, а не 64-битными, которые вам нужны.

Возможно, вы захотите попробовать флаг "-m32"g ++ для компиляции всего в 32 бита или для установки 64-битной версии ocaml.

4 голосов
/ 14 февраля 2012

Похоже, что ваш компилятор 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-битные объекты), а затем связать все вместе с компоновщиком (ld), который знает, что он производит 32-битную цель , (Или, как говорит Фабрис Ле Фессант, вы можете установить 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

Ваш второй make-файл все еще не показывает, что вы пытаетесь сделать, в частности. Он просто определяет некоторые правила make для компиляции и компоновки различных типов исполняемых файлов. Однако, поскольку вы говорите, что весь ваш проект OCaml, я бы сказал, что вся проблема в этом Makefile.

Похоже, проблема в том, что этот Makefile указывает, какой компилятор C и библиотеки компилятор OCaml должен использовать в качестве бэкэнда, используя опции -cc и -cclib. В большинстве систем все будет в порядке, если просто указать стандартный компилятор C в качестве серверной части для OCaml. В Mac OS X есть 32-битные / 64-битные архитектурные сложности. Поскольку вы можете успешно скомпилировать OCaml без этого Makefile, я полагаю, что компилятор OCaml уже знает, как компилировать и связывать программы OCaml. Так что вы можете попробовать просто удалить опции -cc и -cclib из Makefile.

Для этого: Во всех трех разделах в OCAML_EXE полностью удалите третью строку (строку с -cc и -cclib), а удалите обратную косую черту в предыдущей строке .

0 голосов
/ 27 ноября 2013

У меня была эта проблема в течение последних двух дней при попытке скомпилировать gphoto2.Я только недавно обновил OS X 10.8 до OS X 10.9.Сначала я подумал, что могут возникнуть проблемы с новой версией XCode и инструментами командной строки.

Я обновил все, но несоответствие архитектуры в ocaml все еще оставалось, поэтому я решил установить версию для домашних пользователей.ocaml:

$ brew install ocaml

et voilà

...