Расширение Visual Studio 2015 / Linux выдает «collect2: ошибка: ld вернул 1 статус выхода» с помощью Cygwin

#c #linux #visual-studio-2015 #cygwin #ld

#c #linux #visual-studio-2015 #cygwin #ld

Вопрос:

В настоящее время я пытаюсь использовать расширение Linux Visual Studio 2015.

Я планирую иметь несколько целевых компьютеров, использующих разные дистрибутивы. Пока что моей тестовой машиной является Windows 7 с обновленным Cygwin со всеми необходимыми пакетами ( openssh , g , gdb …).

Тест, который я провожу, состоит в очень простом файле C «Hello world», а настройки VS projects являются настройками по умолчанию.

Все работает хорошо, но связь:

  • архитектура распознана Visual Studio
  • исходные файлы правильно скопированы на целевой компьютер с помощью расширения VS
  • они действительно компилируются с использованием g
  • но процесс заканчивается "collect2 : error : ld returned 1 exit status"

Я попытался скомпилировать этот файл на удаленной платформе, используя g . Никаких проблем, исполняемый файл создан, и он работает.

Я абсолютно этого не понимаю. Есть идеи?


Подробности, если необходимо:

  • Мой исходный файл C :

      #include <cstdio>
    
     int main()
     {
        printf("hello from SandboxLinux!n");
        return 0;
     }
      
  • Настройки моего проекта (удаленные настройки и настройки компоновщика, в которых я не вижу ничего особенного):

Настройки проекта
Настройки компоновщика

  • Мой журнал сборки Visual Studio:

введите описание изображения здесь

  • На удаленном компьютере:
    • main.cpp было скопировано правильно
    • .o файл создан правильно
    • .exe .out «) не является
    • далее следуют корневой каталог проекта, obj и bin каталоги:

введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь

  • При использовании g непосредственно на удаленном компьютере:
    • g main.cpp завершается автоматически и выдает a.exe , который работает.
    • Использование g -v не показывает ничего относящегося к делу

Ответ №1:

Хорошо, нашел это! Параметры проекта VS / Linux по умолчанию не подходят для Cygwin:

При переключении выходных данных сборки VS project с «минимального» (по умолчанию) на «нормальный» я мог заметить, что возникла проблема с сгенерированной ld командной строкой:

введите описание изображения здесь

 1>       Link:
1>         Linking objects
1>         Invoking ld
1>         g   -o "/home/xxxxx/projects/xxxxxx/bin/x86/Release/xxxxx.out" -Wl,--no-undefined -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack /home/xxxxx/projects/xxxxx/obj/x86/Release/main.o
1>         /bin/ld: unrecognized option '-z'
1>         /bin/ld: use the --help option for usage information
1>         collect2: error: ld returned 1 exit status
  

-z Опция не реализована в Cygwin и не будет. Поэтому его необходимо удалить из параметров компоновщика VS, где он используется по умолчанию:

Перед: введите описание изображения здесь

После: введите описание изображения здесь (Примечание 1: для третьего необходимо вручную установить значение пусто, поскольку используются оба предложенных варианта -z )
(Примечание 2: все другие различия между этими двумя скриншотами не связаны с этой проблемой. Первая — это моя release конфигурация, сохраняемая по умолчанию, где вторая — это моя debug конфигурация, которая использует verbose и print-map.)

Теперь все работает нормально: введите описание изображения здесь

Программа собрана правильно, она работает, и ссылка с GDB также отлично работает в режиме отладки.

Предостережение: это -z может стать проблемой при последующем переключении с Cygwin на стандартные платформы Linux.