用错误的标志顺序编译后,是否删除*.cpp文件



我真的需要你的帮助!我的makefile有问题。错误非常常见:

makefile:11: recipe for target 'exec' failed

我的生成文件如下:

CC = g++
PY = python
FLAGS = -std=c++11 -O3
all: main exec data
main: main.cpp
$(CC) $(FLAGS) -o $@ $<
exec: main
time ./$<
data: plot.py main
$(PY) $< 

就我而言,没有错误,但我仍然得到了错误,也许main.cpp没有编译?不管怎样,我(出于好奇)尝试了:

g++ -std=c++11 -O3 -o main.cpp main

然后我得到了这个错误:

main: In function `_start':
(.text+0x1360): multiple definition of `_start'
/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../lib64/crt1.o:(.text+0x0): first defined here
main: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../lib64/crti.o:(.fini+0x0): first defined here
main:(.rodata+0x0): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../lib64/crt1.o:(.rodata.cst4+0x0): first defined here
main: In function `data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../lib64/crt1.o:(.data+0x0): first defined here
main:(.rodata+0x8): multiple definition of `__dso_handle'
/usr/lib/gcc/x86_64-redhat-linux/6.3.1/crtbegin.o:(.rodata+0x0): first defined here
main: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../lib64/crti.o:(.init+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/6.3.1/crtend.o:(.tm_clone_table+0x0): multiple definition of `__TMC_END__'
main:(.data+0x8): first defined here
/usr/bin/ld: error in main(.eh_frame); no .eh_frame_hdr table will be created.
collect2: error: ld returned 1 exit status

现在我的main.cpp不见了。实际。。如何恢复?我有一个旧版本,因为我使用的是git,但它还没有完成,我真的需要这个版本。

错误是非常常见的

这就是make错误。在那之前它显示了什么?它运行编译器了吗?是否存在编译错误?是什么?

我在下面解决了你最近的问题,但最初的问题是编译错误。您关注的是构建目标失败的事实,而不是理解为什么失败。

构建总是失败:通常是因为代码中有错误,很少是因为以前工作的makefile中有错误。因此,在开始更改makefile或手动运行编译器之前,您通常需要担心理解和修复编译器错误。


现在我的main.cpp不见了。实际。。

好吧,在中

g++ -std=c++11 -O3 -o main.cpp main

选项CCD_ 1告诉g++对输出使用文件名。因此,它打开main.cpp进行输出,并对内容进行重击。

你的意思是

g++ -std=c++11 -O3 -o main main.cpp

这是一个很容易犯的错误,这就是为什么我们必须建立系统来为我们做这些事情。还有备份。以及版本控制。

将来,您只需键入make main来选择一个目标,并使应该告诉您它在做什么。

如何恢复?

如果您有一个高级SAN,则从编辑器、版本控制、备份或文件系统级别的快照,或者在极端情况下从内存。

没有什么比从头开始重写更能教会你良好的源代码控制和备份习惯了。


不再有主.cpp文件。为什么会这样?

生成失败时,会删除不完整的输出文件。

考虑一下make是如何工作的,以供参考。您有一个名为main的目标,因此它会检查名为main的文件是否存在。

  • 如果main存在,它会查看依赖项,并查看这些文件中是否有比main新的文件
  • 如果它认为main应该(重新)生成(要么它不存在,要么它比依赖项旧),它就会运行您给它的规则

现在,如果g++在编译失败后留下了一个空的(或不完整的)main版本,如何在下次构建时重新生成它?

编译失败时必须删除输出文件,否则make将无法正常工作。你还会有一个目录,里面满是空的或损坏的部分编译的可执行文件和对象文件,这听起来不是一个好主意。


在其他新闻中,您的exec目标不会创建名为-o filename0的文件。这应该是.PHONY规则。data可能也是如此。

问题是:

g++ -std=c++11 -O3 -o main.cpp main

其中指定输出应放置在main.cpp中。您尝试编译main并将结果存储在main.cpp中。由于编译失败,因此在编译停止后将删除输出文件。所以没有main.cpp

很简单:只需在编辑器中再次保存文件。

要执行此操作,请按C-x C-w,然后再次键入文件名。

最新更新