Кто-нибудь знает, как решить ошибку «collect2.exe: error: ld вернул 1 состояние выхода» при запуске программы в C? - PullRequest
1 голос
/ 01 февраля 2020

Прежде всего, я на первом курсе информатики, так что я еще новичок в программировании, а затем простите за отсутствие знаний. Что ж, моя проблема в основном заключается в ошибке, которая отображается на экране каждый раз, когда я пытаюсь запустить (кстати, я использую Sublime Text) программу в C. В этом случае был простой код:

#include <stdio.h>
int main() {    
    //print the heading of the game
    printf("*****************************************\n");
    printf("* Wellcome to the our guessing game *\n");
    printf("*****************************************\n");
    int secretnumber =  42;
    int guess;

    printf("What is your guess?");
    scanf("%d", &guess);
    printf("Your guess was %d \n", guess);
}

ВЫХОД: c: / mingw / bin /../ lib / gcc / mingw32 / 8.2.0 /../../../ ../mingw32/bin/ld.exe: невозможно открыть выходной файл. Olamundo.exe: Отказано в разрешении collect2.exe: ошибка: ld вернул 1 состояние выхода [Завершено за 0,3 с]

Знаете, я пробовал некоторые такие решения, как переместить папку, в которой находится исполняемый файл, и поместить ее в root (в моем случае Mateus (C :)), дать все права на папку, отключить антивирус (в моем случае я просто использую Windows защитник), завершила задачу с помощью диспетчера задач, но ничего не получалось. Пожалуйста, помогите мне, я действительно не знаю, что еще я могу сделать.

1 Ответ

1 голос
/ 02 февраля 2020

В целом, ваша проблема в том, что вы пытаетесь запустить интерактивную программу из Sublime; это не поддерживает это. Sublime захватывает вывод, который ваша программа отправляет на stdout и stderr, и отображает его на панели вывода, но не подключает панель к stdin.

Итак, сценарий, с которым вы столкнулись, работает например:

  1. Вы запускаете интерактивную программу (в вашем случае она запрашивает ввод через scanf(), запускает и запрашивает ввод

  2. Вы пытаетесь ввести ввод, но ничего не происходит, потому что stdin не подключен.

  3. Вы пытаетесь снова запустить программу (или изменить ее и собрать ее). снова думая, что у вас может быть проблема).

  4. Версия, которую вы ранее пытались запустить, все еще работает в фоновом режиме, ожидая ввода, который вы не можете предоставить, и windows блокирует исполняемые файлы во время работы программы. Таким образом, когда компоновщик (collect2) пытается связать исполняемый файл во время сборки, он не может этого сделать, потому что файл заблокирован, что приводит к ошибке разрешения.

Вы можете очистить ошибку, убив p программа работает в фоновом режиме, что можно сделать с помощью Tools > Cancel Build , если вы сделаете это до появления этой ошибки ; если вы уже видели ошибку, скорее всего, она не сработает, потому что она отменяет только самую последнюю сборку, которая будет той, где произошла ошибка.

Другое, что вы можете сделать, это использовать что-то внешнее для убей это; диспетчер задач на windows, kill из терминала на Linux / OSX и др. c. Вам нужно будет сделать это таким образом, если вы уже видите ошибку.

Обратите внимание, что это не решает основную проблему, потому что вы все еще пытаетесь запустить интерактивную программу. Чтобы сделать это из Sublime, вам нужно создать пользовательский sublime-build, который учитывает это. Как правило, вы можете либо запустить внешний терминал и запустить там программу, либо использовать пакет типа Terminus , если хотите сохранить его внутренним.

Для того, чтобы настроить это вы должны быть знакомы с последовательностью команд, необходимых для компиляции, компоновки и запуска программы в одной команде, которую вы можете получить, проверив, какая система сборки вы используете в данный момент (при условии, что вы ее не создавали) себя).

Это видео о буферизации и интерактивных сборках в Sublime (отказ от ответственности, я автор) содержит информацию и примеры того, как Terminus можно использовать для чего-то подобного, если вы ' Мне нравится больше информации.

...