我正在做一些关于外部关键工作的实验,目前正在开发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();
}
这是我编译的方式和终端的执行结果
[root@localhost cpp]# g++ test1.h test2.h -o test.o
[root@localhost cpp]# ./test.o
bash: ./test.o: Permission denied
[root@localhost cpp]#
答案 0 :(得分:5)
你有几个问题。如果使用file(1)
实用程序检查输出文件,您将意识到无法执行它的原因:
$ file test.o
test.o: GCC precompiled header (version 013) for C++
预编译的头文件不是有效的可执行文件 - 它们不是有效的ELF文件,它们不是带有shbang行的脚本文件,它们只是编译器知道如何阅读的数据文件。
为什么要获得预编译的头文件?因为你要求g ++编译头文件(.h
文件)。给你的C ++源文件.h
扩展是非常荒谬的,因为它们不是头文件,而是源文件。为他们提供正确的.cc
或.cpp
扩展名,g ++会将它们正确编译为可执行文件。
其次,为什么要给输出文件命名为test.o
? .o
用于目标文件(单个源文件的编译版本,而不是完整的可执行文件),但是您要求g ++编译完整的可执行文件。如果您只想编译而不是链接,则传递-c
标志,然后手动链接目标文件。不要使用.o
为可执行文件命名。 test
将是从名为test.cc
的源文件编译的可执行文件的更合适的名称,但我会提醒您并建议使用其他内容,因为test
也是一个shell builtin function。
答案 1 :(得分:1)
使用.h
编译g++
文件时,编译器会生成预编译的头文件。这些不是可执行文件。即使您将权限更改为777
,它们也无法运行。
查找此程序在预编译带有“.h”扩展名的C头文件时也很有用,可用于C ++编译。,https://gcc.gnu.org/onlinedocs/gcc-4.8.3/gcc/Invoking-G_002b_002b.html#Invoking-G_002b_002b。
尝试以下命令:
g++ -o test.o test1.h file test.o
你应该得到输出
test.o: GCC precompiled header (version 014) for C++
要创建可执行文件,请将文件重命名为test1.cc
和test2.cc
。然后,使用
g++ -o test test1.cc test2.cc
现在,您将能够使用以下命令执行该程序:
./test