linux下编译c++程序

Posted

技术标签:

【中文标题】linux下编译c++程序【英文标题】:Compiling c++ program under linux 【发布时间】:2009-12-28 02:38:02 【问题描述】:

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

【问题讨论】:

【参考方案1】:

-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)。

【讨论】:

【参考方案2】:

表示你生成的文件不是可执行文件。

您可以使用链接器 (ld),也可以一步编译和链接(首选)。

做后者:

g++ -o <output name> -I/include/page -Llibpath -llibone -llibtwo source1.cpp source2.cpp

这将生成一个可执行文件,其中包含运行所需的所有内容。

【讨论】:

ldd 不是构建链接器。它是运行时链接器 (ld.so.1) 的前端,用于显示运行时依赖项。此外,不建议直接调用链接器,因为您需要手动指定各种支持对象。即使在进行单独的编译和链接时,使用 g++ 作为链接驱动程序也容易得多。 您想使用链接编辑器ld 来创建不是ldd 的可执行文件。如果您想了解幕后到底发生了什么,请尝试g++ -v heap.cpp -o heap。它将显示gcc 所做的所有不同步骤。 哎呀,不是 ldd...我的错误(有点累)。【参考方案3】:

正如其他人所说,您需要编译和链接您的 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++ 程序的源代码可执行。

【讨论】:

【参考方案4】:

.o 文件不是可执行文件。它仍然需要链接。

【讨论】:

【参考方案5】:

您会收到错误消息,因为您尝试执行的文件不是可执行文件。 gcc(1) man page 表明-c 对象只是将给定的源文件编译为目标文件,而目标文件并未链接到可执行文件中。

尝试不使用 -c 运行以生成可执行文件。

【讨论】:

以上是关于linux下编译c++程序的主要内容,如果未能解决你的问题,请参考以下文章

linux下编译c++程序报错no such file or directory 是啥原因?

如何在windows的命令行环境下编译C++程序?

linux下编译运行C程序

Windows下编译TensorFlow1.3 C++ library及创建一个简单的TensorFlow C++程序

请教:qt下如何调用linux下编译的驱动程序

在 Windows 和 Linux 下开发的 C++ 程序的区别