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 是啥原因?