#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.