如何修复错误:g++.exe:无法使用 -c 或 -S 指定 -o 以及多次编译

问题描述 投票:0回答:2

程序没有运行。如何修复它(我使用C-Free 4.0) ? g++.exe :无法使用 -c 或 -S 指定 -o 以及多次编译

c++ c
2个回答
0
投票

您可以包含您正在使用的整个构建命令吗? 我的猜测是,您正在尝试在单个命令中将多个文件编译为可执行文件(例如

g++ file1.cc file2.cc file3.cc -o file.exe
),但您在编译命令中也有一个
-c
标志。

供参考,通常编译时会发生两件事。 首先,源代码变成机器代码。 其次,机器代码被链接以生成可执行文件。

在 gcc/g++ 中,您可以使用

-c
标志将一个源文件编译为机器代码。 您可以使用
-o
标志将一个(或多个)机器代码文件链接到可执行文件中。 有一种简写方式,您可以使用
-o
标志一次性编译和链接所有内容(但这通常不是一个好主意,因为对任何文件的任何更改都需要您重新编译 所有内容)。

至于

-S
,那是当你想从源代码生成汇编代码时。 不过,我猜这不是你正在做的事情。

这里有一个例子,只是为了完善它。 假设你有文件

file1.cc
file2.cc
,并且
main()
中有一个
file1.cc
函数。 然后你可以像这样创建机器代码:

g++ file1.cc -c
g++ file2.cc -c

这将导致出现两个新文件,file1.o 和 file2.o。

接下来,您可以像这样链接它们:

g++ file1.o file2.o -o file.exe

这将生成

file.exe
,您可以运行的最终可执行文件。


0
投票

同样的问题。尝试构建legacybios。

旧版 GCC 告诉:“不能使用 -c 或 -S 指定 -o 以及多次编译”。

新的 GCC 告诉:“无法识别的命令行选项‘-combine’”。

某种恶性循环!

这是legacybios的Makefile产生的命令:

GCC -Wall -Os -MD -m32 -DMODE16 -march=i386 -mregparm=2 -ffreestand -fno-jump-tables -fwhole-program -S -combine -c src/floppy.c src/disk.c src/system.c src/clock.c src/serial.c src/kbd.c src/output.c src/boot.c -o out/blob.16.s

© www.soinside.com 2019 - 2024. All rights reserved.