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