如何使用extern在g ++中编译多个文件

时间:2014-06-15 04:48:40

标签: c++ g++ fedora

我正在做一些关于外部关键工作的实验,目前正在开发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]# 

2 个答案:

答案 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.cctest2.cc。然后,使用

从它们构建可执行文件
g++ -o test test1.cc test2.cc

现在,您将能够使用以下命令执行该程序:

./test