gcc не будет компилироваться в исполняемый файл - PullRequest
0 голосов
/ 24 сентября 2018
#include <stdlib.h>

int main(int argc, char* argv[]) 
{
    // printf("Hello World!\n");
    return 0;
}

gcc --version

gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 Copyright (C) 2017 Free Software Foundation, Inc. Это бесплатное программное обеспечение;см. источник для условий копирования.Там нет гарантии;даже не для ТОВАРНОЙ ИЛИ ФИТНЕС ДЛЯ ОСОБЕННОЙ ЦЕЛИ.

gcc -O0 -g -o-helloworld -c helloworld.c

Это новая система, созданная сегодня с нуля.Ubuntu 18.04.

Создает файл helloworld, но не исполняемый, если я сделаю это и попробую запустить его, я получу

$ chmod + x helloworld

$ ./helloworld

bash: ./helloworld: невозможно выполнить двоичный файл: ошибка формата Exec

Однако, похоже, мой большой проект компилируется без проблем.

Несмотря на то, что это свежая система, которую я переустанавливалgcc но без разницы.

1 Ответ

0 голосов
/ 24 сентября 2018

Флаг -c указывает gcc превратить исходный файл в файл объект для последующей ссылки на исполняемый файл.

Создание исполняемого файла объекта никоим образом не поможетпри попытке запустить его, вам нужно связать его и создать исполняемый файл real .Вероятно, самый простой способ сделать это - избавиться от -c из командной строки.

Если у вас было что-то более сложное (например, несколько исходных файлов, которые вы хотели скомпилировать отдельно, а затем связать всеобъекты вместе), флаг -c был бы полезен.

Однако, поскольку у вас есть один исходный файл, из которого вы хотите сделать исполняемый файл, просто используйте:

gcc -O0 -g -o helloworld helloworld.c

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

...