web-dev-qa-db-fra.com

Erreur de format Exec de Hello World c ++ compilé avec gcc

Je sais qu'il y a beaucoup de questions similaires avec ce message d'erreur ici. Mais je ne trouve pas encore de solution.

Sur le serveur AWS Ubuntu, j’ai écrit c ++ Hello, programme mondial

#include <iostream>
using namespace std;

int main(){
        cout<<"Hello, World!"<<endl;
        return 0;
}

et compilé:

ubuntu@ip-xxxxx:~/dev/c++$ g++ -c ./test.cc -o out
ubuntu@ip-xxxxx:~/dev/c++$ chmod a+x out
ubuntu@ip-xxxxx:~/dev/c++$ ./out
-bash: ./out: cannot execute binary file: Exec format error
ubuntu@ip-xxxxx:~/dev/c++$ file ./out
./out: ELF 64-bit LSB  relocatable, x86-64, version 1 (SYSV), not stripped
ubuntu@ip-xxxxx:~/dev/c++$ uname -a
Linux ip-xxxxx 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
ubuntu@ip-xxxxx:~/dev/c++$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

Il semble que l'architecture x86-64 soit la même. Quel est le problème ici? Dois-je ajouter plus de drapeaux c ++?

5
Daebarkee

L'indicateur -c indique à g++ de compiler votre code source en code objet, mais évitez de le lier aux bibliothèques nécessaires pour créer un binaire exécutable autonome. De man gcc:

   -c  Compile or assemble the source files, but do not link.  The linking
       stage simply is not done.  The ultimate output is in the form of an
       object file for each source file.

Pour créer un programme exécutable, exécutez simplement votre commande à nouveau sans l'indicateur -c:

g++ test.cc -o out

suivi par

./out

(l'indicateur de l'exécutable sera défini par défaut - un chmodexplicite ne devrait pas être requis).

10
steeldriver