2014-02-23 45 views
0

问题/目标 我试图找出如何得到完全控制了NetBeans编译命令,这样我可以从改变:指定netbeans用于编译C++程序的完整编译命令?

“G ++ main.cpp中Foo.cpp中bar.cpp”

到:

'的g ++ main.cpp中-Wall'

原因 如果我登录到终端和手动键入: '克++ main.cpp中-Wall',我的程序将COMP ile就好了。当我尝试使用netbeans进行编译时,我在控制台中看到它正在执行'g ++ main.cpp foo.cpp bar.cpp',并且失败了,因为main.cpp已将foo.cpp和bar.cpp包含在文件。我得到“文件/方法的多重定义”错误。

问题 那么,我该如何去改变命令,使它只包含编译命令中的main.cpp?更好的是,你如何手动指定整个命令字符串?

回答

1

从你的解释来看,你首先做错了。当你有多个cpp文件时,你将它们中的每一个编译成一个单独的目标文件,然后将它们连接在一起。使用#include包含一个.cpp文件是一个错误的方法 - 这是头文件(.h)文件的用途。

头文件(.h)包含在C++文件(.cpp)中定义的代码部分的声明。通过包含标题,您可以使用其他地方定义的函数。其他地方可能是另一个目标文件(.o或.obj - 由gcc -c something.cpp创建)或库文件(.lib)。当你有3个cpp文件,a.cp​​p,b.cpp,c.cpp,他们都用彼此的功能,编译循环将是:

gcc -c a.cpp -> yields a.o 
gcc -c b.cpp -> yields b.o 
gcc -c c.cpp -> yields c.o 

gcc -o program a.o b.o c.o -> yields program (executable) 

或者简写:

gcc a.cpp b.cpp c.cpp -o program 

当b.cpp需要c.cpp定义的函数,则b.cpp需要

#include <c.h> 

在Ch包含的是b需要使用函数的声明。

当您在源代码中执行类似#include "b.cpp"的操作时,它几乎总是错误的。