Ocamlopt ничего не выводит, только код ошибки

Я пытаюсь обратиться к громоздкой библиотеке C++ из OCaml, и у меня возникают проблемы с ocamlopt, который сразу выдает ошибку с кодом 2.

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

Есть ли способ узнать, что именно не работает? Я попробовал флаг -verbose, но он просто печатает аргументы командной строки (которые довольно длинные).

Не могли бы вы дать какие-нибудь советы о том, как расследовать такой тихий сбой?

Может помочь, если вы назовете используемую систему (Linux, MacOS, Windows) и включите несколько строк, показывающих ошибку, которую вы видите. Термин «код ошибки» не совсем ясен. Было бы крайне странно, если бы ocamlopt (да и вообще любая серьезная программа) вызывала exit(2) без предварительного написания поясняющего сообщения. Возможно, сообщение об ошибке заканчивается где-то в стороне.

Jeffrey Scofield 20.03.2019 05:35

Это CentOS Linux. Выхода нет, поэтому я в недоумении, что делать.

Tatiana Racheva 20.03.2019 08:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

TL;ДР; проверьте, достаточно ли у вас памяти и/или места на диске.

Нечто подобное может произойти, когда ocamlopt либо уничтожается сигналом, либо заканчивается память (или и то, и другое), проверьте вывод dmesg, найдите сообщения OOM от ядра, также используйте htop, чтобы получить представление об объеме памяти.

Кроме того, поскольку это происходит, когда вы пытаетесь скомпоновать библиотеку C++, скорее всего, это процесс ld, который дает сбой (опять же, скорее всего, с OOM), поскольку ocamlopt использует системный компоновщик.

Ах, dmesg ничего мне не сказал, но я попробовал strace ld и нашел это: write(2, "ld", 2ld) = 2 write(2, ": no input files\n", 17: no input files ) = 17

Tatiana Racheva 20.03.2019 15:13

это была хорошая идея использовать strace! Итак, у нас есть три проблемы: 1) вы не видите вывод - это может быть ошибка в компиляторе, но, насколько мне известно, он использует system(2) для вызова системного компоновщика без каких-либо перенаправлений (strace dup может доказать мою неправоту ). Так что, скорее всего, ваша система сборки куда-то перенаправляет stderr. 2) компилятор недостаточно очищает ввод, что приводит к сбою компоновщика. 3) скорее всего, вы используете ocamlopt как-то неправильно (и уж точно не так, как ожидалось).

ivg 20.03.2019 17:23

Решения для (1), если он действителен, отправьте вопрос на github.com/ocaml/ocaml. Для (2) отправьте запрос функции в том же месте. Для (3) отправьте вопрос в SO или просто обновите свой, чтобы мы могли выяснить, что не так с вашим вызовом. Во всяком случае, в противном случае нам нужно отправить еще одну проблему в систему отслеживания проблем OCaml.

ivg 20.03.2019 17:25

Я думаю, что моя система сборки генерирует слишком длинную команду. Я пробовал помещать (экранировать) новые строки после каждого -ccopt (большинство из них -I с путем поиска каталога), и я определил точку, в которой количество аргументов слишком велико (в конце концов, моя маленькая программа не нужны все те заголовки, которые приходят из зависимостей). После того, как я пройду мимо ошибки компилятора, у меня все еще будет проблема с собственно компоновщиком (слишком много аргументов -cclib), поскольку компоновщику действительно нужны все зависимости. На данный момент я чувствую себя довольно обескураженным :(

Tatiana Racheva 22.03.2019 05:38

Одна вещь, которую я хочу попробовать завтра, — передать gcc аргумент @file, чтобы посмотреть, сможет ли он таким образом обрабатывать аргументы. Я не смотрел, есть ли что-то подобное у ld.

Tatiana Racheva 22.03.2019 05:40

Хорошо, я только что подтвердил, что ld также принимает параметр @file, так что это многообещающе.

Tatiana Racheva 22.03.2019 05:55
Ответ принят как подходящий

На случай, если кто-то еще столкнется с этим снова: проблема заключалась в том, что драйвер сборки передавал слишком много аргументов -ccopt и -cclib. Когда я начал включать библиотеку C++ с множеством других зависимостей, казалось, что мы достигли критической точки.

Решение состояло в том, чтобы изменить правила компилятора и компоновщика OCaml драйвера сборки, чтобы записать все аргументы компилятора и компоновщика в файлы, чтобы их можно было передавать как один аргумент -ccopt @<compiler.args> или -cclib @<linker.args>. И gcc, и ld поддержка параметра командной строки @file.

Проблема с GitHub: ocamlopt позволяет компилятору/компоновщику молча выйти из строя, если передается слишком много аргументов -ccopt или -cclib.

Другие вопросы по теме