当我想运行源代码时,为什么会这样:
background thread performs an in-memory sort by key
然后
gcc test.c -o test.o
但这不起作用:
./test.o
然后
gcc -c test.c
并收到此消息
./test.o
答案 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
的信息,请参见-c
或Overall 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中的一个基本问题。请注意,如果要在单个命令(例如
)中获取可执行文件,请不要使用参数-cgcc -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