Запуск скомпилированной программы - «Неверный аргумент» - PullRequest
4 голосов
/ 12 марта 2011

У меня есть простая программа Hello World C ++ (main.cpp):

#include <iostream>

using namespace std;

int main ( void ) {
    cout << "Hello world" << endl;
    return ( 0 );
}

Я компилирую ее через

g++ -Wall -pedantic -Wno-long-long -Werror -c main.cpp

, затем добавляю разрешение "быть исполняемым"

chmod +x main.o

и попробуйте запустить его

./main.o

Моя консоль вернет

-bash: ./main.o: Invalid argument

Что я делаю, выкручивая?

1 Ответ

8 голосов
/ 12 марта 2011

Опция -c указывает компилятору просто скомпилировать исходный файл в «объектный файл», а не связывать его.

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

g++ -o main.x -Wall -pedantic -Wno-long-long -Werror main.cpp

. Это сгенерирует исполняемый файл main.x (я обычно использую .x для исполняемых файлов и .o для объектных файлов);обратите внимание, что это будет chmod правильно для выполнения.(совет: другой полезный параметр в стиле lint - -Wextra; в оптимизированных сборках вы также должны учитывать -O3)

Промежуточный шаг часто выполняется, когда у вас есть несколько файлов для компиляции, а затем связать их вместе;хотя вы можете просто передать все источники в качестве аргументов компилятору и позволить ему выполнить всю работу, это означает, что при каждой перекомпиляции вы перекомпилируете все исходные файлы, и если у вас начинаются большие проектыэто может быть проблемой с точки зрения потерянного времени (просто чтобы дать вам идею: создание OpenOffice.org с нуля может занять более 4 часов).

Вместо этого в этих ситуациях вы просто перекомпилируете объектные файлыизмененные файлы, и связывайте все вместе, передавая имена объектных файлов g++ (или ld, если вы чувствуете себя достаточно смелыми, чтобы возиться с опциями компоновщика).Обычно эта операция автоматизируется с помощью Makefiles или других систем сборки.

...