在linux下编译c ++程序

时间:2009-12-28 02:38:03

标签: c++ linux g++

我正在尝试在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;
}

5 个答案:

答案 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的情况下运行以生成可执行文件。