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

Nay*_*iya 3 c++ g++ fedora

我正在做一些关于外部关键工作的实验,目前正在开发Fedora 19和g ++.我试图编译多个c ++文件并执行该程序.在这里编译成功.但是当试图运行它时会显示Permission denied错误.我改为使用chmod777的许可.但结果仍然相同.然后我尝试编译并运行一个简单的Hello World程序,并且工作正常.我的程序有什么问题?

test1.h

int a=0;
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

这是我编译的方式和终端的执行结果

[root@localhost cpp]# g++ test1.h test2.h -o test.o
[root@localhost cpp]# ./test.o
bash: ./test.o: Permission denied
[root@localhost cpp]# 
Run Code Online (Sandbox Code Playgroud)

Ada*_*eld 5

你有几个问题.如果使用该file(1)实用程序检查输出文件,您将意识到无法执行它的原因:

$ file test.o
test.o: GCC precompiled header (version 013) for C++
Run Code Online (Sandbox Code Playgroud)

预编译的头文件不是有效的可执行文件 - 它们不是有效的ELF文件,它们不是带有shbang行的脚本文件,它们只是编译器知道如何读取的数据文件.

为什么要获得预编译的头文件?因为你要求g ++编译头文件(.h文件).给你的C++源文件.h扩展是非常荒谬的,因为它们不是头文件,而是源文件.给它们正确的.cc.cpp扩展名,g ++会将它们正确地编译成可执行文件.

其次,为什么要给输出文件命名test.o.o用于目标文件(单个源文件的编译版本,而不是完整的可执行文件),但是你要求g ++编译完整的可执行文件.如果您只想编译而不是链接,则传递该-c标志,然后手动将目标文件链接在一起.不要用你的可执行文件命名.o. test对于从命名的源文件编译的可执行文件来说,它是更合适的名称test.cc,但是我要小心并建议使用其他东西,因为test它也是shell内置函数的名称.