我正在做一些关于外部按键的实验,目前正在使用Fedora 19和g ++。我试图编译多个c ++文件并执行程序。在这里,它编译成功。但是当尝试运行它时会显示Permission denied
错误。我更改为使用chmod
777的权限。但结果仍然相同。然后我尝试编译并运行一个简单的Hello World程序,效果很好。我的程序怎么了?
test1.h
int a=0;
test2.h
#include <iostream>
using namespace std;
extern int a;
void foo()
{
cout << "This is a test string " << endl;
cout << a << endl;
}
int main()
{
foo();
}
这是我编译和Terminal执行结果的方式
[root@localhost cpp]# g++ test1.h test2.h -o test.o
[root@localhost cpp]# ./test.o
bash: ./test.o: Permission denied
[root@localhost cpp]#
你有几个问题。如果使用该file(1)
实用工具检查输出文件,您将了解为什么无法执行该文件:
$ file test.o
test.o: GCC precompiled header (version 013) for C++
预编译的头文件不是有效的可执行文件,它们不是有效的ELF文件,也不是带有短行的脚本文件,它们只是编译器知道如何读取的数据文件。
为什么会得到预编译的头文件?因为您要让g ++编译头文件(个.h
文件)。为您的C ++源文件.h
扩展名真的很荒谬,因为它们不是头文件,而是源文件。给他们适当的.cc
或.cpp
扩展,和g ++将正确编译他们的可执行文件。
其次,为什么要给输出文件命名test.o
?.o
用于对象文件(单个源文件的编译版本,而不是完整的可执行文件),但是您要让g ++编译完整的可执行文件。如果只想编译而不是链接,则传递该-c
标志,然后手动将目标文件链接在一起。不要使用来命名可执行文件.o
。test
这是从名为的源文件编译的可执行文件的更合适的名称test.cc
,但我要避免这样做,并建议使用其他test
名称,因为它也是shell内置函数的名称。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句