Похоже, что ваш компилятор 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
), а удалите обратную косую черту в предыдущей строке .