我有简单的Hello World C ++程序(main.cpp):
#include <iostream>
using namespace std;
int main ( void ) {
cout << "Hello world" << endl;
return ( 0 );
}
我通过
编译g++ -Wall -pedantic -Wno-long-long -Werror -c main.cpp
然后添加“be executable”权限
chmod +x main.o
并尝试运行它
./main.o
我的控制台返回
-bash: ./main.o: Invalid argument
我在干什么?
答案 0 :(得分:8)
-c
选项指示编译器只在“目标文件”中编译源文件,而不是链接它。
如果没有链接步骤,您获得的目标文件不是可执行文件,而只是一个中间步骤。您可能想要做的是
g++ -o main.x -Wall -pedantic -Wno-long-long -Werror main.cpp
这将生成可执行文件main.x
(我通常使用.x
表示可执行文件,.o
表示目标文件);注意它已经chmod
正确执行了。 (提示:另一个有用的“lint-style”选项是-Wextra
;在优化版本中,您还应该考虑-O3
)
当您有多个文件要编译然后链接在一起时,通常会执行中间步骤;虽然您可以简单地将所有源作为参数传递给编译器并让它完成所有工作,但这意味着在每次重新编译时,您都要重新编译所有源文件,如果您开始变大项目这可能是浪费时间的问题(只是为了给你一个想法:从头开始构建OpenOffice.org可能需要4个多小时)。
相反,在这些情况下,您只需重新编译已修改文件的目标文件,并将所有内容链接在一起,将目标文件的名称传递给g++
(或ld
,如果您觉得足够勇敢的话链接器选项)。通常,此操作使用Makefile或其他构建系统自动执行。