为什么我无法运行目标文件?

时间:2016-09-19 05:40:19

标签: c++ c gcc

当我想运行源代码时,为什么会这样:

background thread performs an in-memory sort by key

然后

gcc test.c -o test.o

但这不起作用:

./test.o

然后

gcc -c test.c

并收到此消息

./test.o

5 个答案:

答案 0 :(得分:5)

首先,您不是创建目标文件而是创建可执行文件文件。目标文件是一个中间文件,用作链接器创建可执行文件的输入文件。您使用.o后缀命名并不重要。

其次,由于传统,如果您没有使用-o选项指定输出文件名,编译器前端程序和链接器将创建名为a.out的可执行文件。

但这并不是全部,因为在第二个例子中,您实际上是在创建一个真实的目标文件,而这些文件不可执行。如上所述,需要将这些传递到单独的链接步骤以创建可执行文件。

您需要创建一个可执行文件:

gcc test.c
./a.out

您应该将目标文件链接到可执行文件中:

gcc -c test.c            # Create object file
gcc test.o -o test       # Use object file to create executable file
./test                   # Run the executable file

答案 1 :(得分:3)

您收到该消息是因为编译器没有在目标文件上设置可执行位,因为 - 好吧,因为它们不可执行。如果您手动设置可执行位并尝试运行它,您将获得类似“未知可执行格式”的内容。

现在,它不仅仅是一个格式问题 - 关键是一个目标文件只是工作的一半,以获得可以实际执行的东西。特别是,它缺少链接步骤,其中链接器找到未解析的引用,并使用其他目标文件中的地址修补它们 - 包括未明确指定的地址,如标准库 - 并生成一个适当的可执行文件,内核知道如何加载和执行。

答案 2 :(得分:1)

在第一种情况下,您只使用test.o 命名生成的文件-o,它已经汇编并链接。

在第二种情况下,您只是编译和汇编,它无法在没有链接的情况下运行。有关gcc --h的信息,请参见-cOverall options for gcc

  

-c

     

编译或汇编源文件但不链接链接阶段根本没有完成。最终输出是每个源文件的目标文件的形式。       默认情况下,源文件的目标文件名是通过将后缀“.c”,“。i”,“。s”等替换为“.o”来生成的。

Unrecognized input files, not requiring compilation or assembly, are ignored. 

(强调我的)

您需要链接它然后执行它:

gcc -o a.out test.o

答案 3 :(得分:0)

您无法运行目标文件。这不可执行,需要链接才能变为可执行文件。

尝试

gcc -o test test.c并使用./test.out

运行

答案 4 :(得分:0)

这是gcc中的一个基本问题。请注意,如果要在单个命令(例如

)中获取可执行文件,请不要使用参数-c
gcc -c xx.c yy.c -o new

。但您可以在以下命令中使用-c获取可执行文件

gcc -c xx.c yy.c
gcc xx.o yy.o -o new

它相当于

gcc xx.c yy.c -o new