我对Ubuntu相当陌生,最近,我通过在终端中键入来创建.o文件:
g++ -Wall -std=c++11 -c average.cpp -o average.o
但是,当我尝试执行.o文件时,出现此错误:
bash: ./average: No such file or directory
即使我显然有文件。因此,我决定输入file average.o
,这让我明白了:ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
。
问题是否在于它必须是32位可执行文件?如果是的话,如何将其更改为32位可执行文件?
编辑:这样我就可以创建average
,但是当我尝试运行它时,会出现以下错误:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
Aborted (core dumped)
编辑2:我能够修复核心转储并设法为我的文件提供运行权限,但是现在,我遇到了一个新错误:
bash: ./average: cannot execute binary file: Exec format error
。
当我这样做的时候file averge
,我得到了:
average: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
。
.o
文件不是可执行文件。
请尝试以下方法之一:
跳过.o
文件的创建并创建可执行文件
g++ -Wall -std=c++11 average.cpp -o average
./average
将.o
文件链接到可执行文件
g++ -Wall -std=c++11 -c average.cpp -o average.o
g++ -Wall -std=c++11 -o average average.o
./average
如果该average
文件仍然无法运行,请尝试授予其权限
chmod +x average
编辑(07/03/17)
我被要求解释命令的作用,所以就到这里了。
这是编译器,它将解释您的代码并将其转换为机器可以解释的机器代码。
您可以在手册页上阅读有关它的更多信息。只需打开终端并输入即可man g++
。
该标志告诉编译器告诉您几乎所有警告(Wall =全部警告)。看一下下面的代码。
int i = 1;
if (i > i) { ... }
如果您不放置该标志,则-Wall
不会显示警告,但是如果您看到该标志,则会显示以下内容:
warning: self-comparison always evaluates to false [-Wtautological-compare]
if (i > i) {}
使用此标志,您可以告诉编译器要使用哪种版本的语言。这是一个非常复杂的主题,但是简而言之,C ++是一种生动的语言,这意味着它会随着时间的推移而变化并有所改进,C ++ 11是其中的一种变化,并且增加了很多改进。现在您可以使用-std=c++14
,今年某个时候您可以使用-std=c++17
。
您似乎对C ++陌生,所以不必担心所有此版本的事情!:D
无需链接即可编译。
基本上允许创建.o
文件(也称为目标文件),这些文件包含一堆数据(主要是已编译的代码)和供编译器链接对象的信息。
它使大型项目的编译更快,因为当您更改一个文件时,只需要创建一个目标文件并将其链接到已编译的目标文件即可。
从man
页面中获取:
将输出放置在文件文件中。这适用于所产生的任何类型的输出,无论是可执行文件,目标文件,汇编文件还是预处理的C代码。
基本上,此标志告诉编译器将其正在执行的任何过程的结果放在何处(编译/链接/ ...)。
希望这个解释有所帮助!:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句