Как установить архитектуру программы для компилятора в VS Code?

#c #gcc #visual-studio-code

#c #gcc #visual-studio-code

Вопрос:

Я написал следующую программу на C:

 #include <stdio.h>

int main()
{
    printf("size of void pointer in bytes : %dn", sizeof(void*));
    return 0;
}
  

Сейчас я использую Windows 10, следовательно, я установил компилятор gcc (MinGW для Windows). Теперь я хочу скомпилировать свою программу один раз для 32-разрядной архитектуры, а затем для 64-разрядной архитектуры. Для этого я добавил m32 в args параметр in launch.json , а затем скомпилировал программу. После этого я сделал то же самое, но для 64-битной архитектуры (добавлен m64 флаг).

В обоих случаях вывод программы был:

 size of void pointer in bytes : 8
  

Это заставило меня задуматься. Если я скомпилирую свою программу в Visual Studio (там вы можете выбрать архитектуру довольно просто, в выпадающем меню рядом с «зеленой стрелкой»), тогда размер слова составляет 4 байта (32-разрядная архитектура) и 8 байт (64-разрядная архитектура), как и должно быть.

Я также пытался использовать -march=i386 для 32-битной архитектуры, но это мне не помогло, указатель по-прежнему был длиной 8 байт. Кажется, что переданные аргументы вообще не влияют на архитектуру. Я что-то упускаю или использую неправильные аргументы для своих целей?

Мой launch.json файл (с -m32 флагом):

 {
    "version": "0.2.0",
    "configurations": [
        {
            "name": "gcc.exe - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\${fileBasenameNoExtension}.exe",
            "args": ["-m32"],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:\Compilers\MinGW\mingw64\bin\gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C  : gcc.exe build active file"
        }
    ]
}
  

Ответ №1:

launch.json содержит команды, описывающие, как запускать скомпилированные файлы. args передаются ли аргументы командной строки программе ( argc , argv ), а не компилятору.

Вам нужно настроить tasks.json , который в основном выполняет скрипты.

Найдите (ctrl shift P для меня) Tasks:Configure Task или Task:Configure Default build Task . Или вы можете найти их в меню терминала.

Он может gcc самостоятельно находить и создавать для него задачу по умолчанию, которая компилирует текущий активный файл. К сожалению, у меня нет опыта непосредственного управления многофайловыми проектами в VSCode, поэтому я не могу помочь больше, но вы должны быть в состоянии найти какое-то значение по умолчанию tasks.json для C в Интернете. Или используйте CMake или аналогичный.

Комментарии:

1. Большое спасибо, это было решение. Однако теперь я получаю другую ошибку. Я понимаю, что это, строго говоря, другой вопрос, но, может быть, вы знаете, почему это происходит (я передал -m32): непризнанный режим эмуляции: 32.exe Поддерживаемые эмуляции: i386pep i386pe collect2.exe : ошибка: ld вернул 1 статус выхода Я также пробовал i386pep и i386pe — это не помогает.

2. Извините, я не знаю, я предполагаю, что MinGW просто не поддерживает эту опцию?

3. Возможно. Я посмотрю, что я могу сделать с этой ошибкой. Спасибо за ваш ответ.