gcc 不会编译为可执行文件

Wal*_*lyZ 5 gcc compilation

#include <stdlib.h>

int main(int argc, char* argv[]) 
{
    // printf("Hello World!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会——版本

gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 版权所有 (C) 2017 Free Software Foundation, Inc. 这是免费软件;请参阅复制条件的来源。没有保修;甚至不是为了适销性或特定用途的适用性。

gcc -O0 -g -o helloworld -c helloworld.c

这是今天从头开始构建的全新系统。乌班图18.04。

生成一个 helloworld 文件,但如果我这样做并尝试运行它,则不可执行

$ chmod +x 你好世界

$ ./helloworld

bash: ./helloworld: 无法执行二进制文件: Exec 格式错误

不过,似乎编译我的大型项目没有任何问题。

尽管它是一个新系统,我重新安装了 gcc,但没有区别。

pax*_*blo 6

-c标志指示gcc将源文件转换为目标文件,以便稍后链接到可执行文件。

使目标文件可执行对尝试运行它没有任何帮助,您需要链接它并生成真正的可执行文件。-c也许最简单的方法就是从命令行中删除。

如果您有更复杂的东西(例如您想要单独编译多个源文件,然后将所有对象链接在一起),则该-c标志将很有用。

但是,由于您有一个源文件想要从中生成可执行文件,因此只需使用:

gcc -O0 -g -o helloworld helloworld.c
Run Code Online (Sandbox Code Playgroud)

无论如何,这个答案可能提供有关生成可执行文件的各个阶段的更多信息。它专门涵盖了静态链接和动态链接之间的区别,但答案也提供了编译/链接区别的良好概述。