我正在尝试在linux下编译简单程序。这些是我执行的一组操作。
[mypc@localhost programs]$ vim heap.cpp
[mypc@localhost programs]$ g++ -c heap.cpp
[mypc@localhost programs]$ chmod 777 heap.*
[mypc@localhost programs]$ g++ -c heap.cpp
[mypc@localhost programs]$ ./heap.o
bash: ./heap.o: Permission denied
[mypc@localhost programs]$ ls
heap.cpp heap.o
[mypc@localhost programs]$ ls -l
total 8
-rwxrwxrwx. 1 mypc mypc 67 2009-12-28 12:01 heap.cpp
-rw-rw-r--. 1 mypc mypc 1548 2009-12-28 12:02 heap.o
[mypc@localhost programs]$ chmod 777 heap.o
[mypc@localhost programs]$ ./heap.o
bash: ./heap.o: cannot execute binary file
[mypc@localhost programs]$
这是什么错误?
这是一个程序
#include<iostream>
using namespace std;
int main(){
return 0;
}
答案 0 :(得分:9)
-c选项告诉编译器生成目标文件,而不是最终的二进制文件。您仍然需要链接您的代码。
如果您只有一个文件,则可以一步完成编译和链接:
g++ heap.cpp -o heap
当你进入更大的程序时,你会想要将编译与链接分开。假设您要在heap.cpp和main.cpp之间拆分代码。首先,您将进行编译步骤,然后将它们链接在一起:
g++ -c heap.cpp
g++ -c main.cpp
g++ -o program_name heap.o main.o
最后,默认情况下,链接步骤会创建一个名为a.out的文件。如果你想这样指定名称,请确保使用-o选项(编译时不需要,因为默认情况下将NAME.EXTENSION转换为NAME.o)。
答案 1 :(得分:3)
这意味着您生成的文件不是可执行文件。
您可以使用链接器(ld),也可以在一个步骤(首选)中进行编译和链接。
做后者:
g++ -o <output name> -I/include/page -Llibpath -llibone -llibtwo source1.cpp source2.cpp
这将生成一个可执行文件,其中包含与其链接运行所需的所有内容。
答案 2 :(得分:2)
正如其他人所说,你需要编译和链接你的C ++程序才能运行它。你可以用GCC这样做:
g++ -o heap heap.o
C和C ++中都存在编译和链接步骤。
您还需要设置适当的权限才能运行文件。假设你的程序编译和链接没有错误,你应该得到一个具有适当权限的二进制文件,它应该是这样的:
[mypc@localhost programs]$ ls -l
-rwxrwxrwx. 1 mypc mypc 67 2009-12-28 12:01 heap.cpp
-rw-rw-r--. 1 mypc mypc 1548 2009-12-28 12:02 heap.o
-rwxrwxr-x. 1 mypc mypc 1548 2009-12-28 12:02 heap
左侧的字母代表读,写或执行。第一组三个用于文件的所有者(名为mypc),下一组三个用于文件的组所有者(也称为mypc,但是一个单独的实体),最后一组用于所有文件这些文件所在的文件系统的其他用户(又名“世界”)。
如果没有设置执行位,可以使用以下命令在Unix中设置它:
chmod o+x heap
这将为所有者添加执行位。
通过提供的介绍,您可能希望这样做以从C ++源代码中删除执行执行位:
chmod a-x heap.cpp.
没有充分的理由让C ++程序的源代码可执行。
答案 3 :(得分:1)
.o文件不是可执行文件。它仍然需要联系起来。
答案 4 :(得分:1)
由于您尝试执行的文件不是可执行文件,因此出现错误。 gcc(1) man page表示-c
对象仅将给定的源文件编译为目标文件,但目标文件未链接到可执行文件中。
尝试在没有-c的情况下运行以生成可执行文件。