#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. Возможно. Я посмотрю, что я могу сделать с этой ошибкой. Спасибо за ваш ответ.