问题/目标 我试图弄清楚如何完全控制netbeans编译命令,以便我可以改变它:
'g ++ main.cpp foo.cpp bar.cpp'
为:
'g ++ main.cpp -Wall'
原因 如果我登录终端并手动输入:'g ++ main.cpp -Wall',我的程序将编译得很好。当我尝试使用netbeans进行编译时,我在控制台中看到它正在执行'g ++ main.cpp foo.cpp bar.cpp',并且由于main.cpp已经包含foo.cpp和bar.cpp位于顶部而失败了文件。我得到“文件/方法的多重定义”错误。
问题 那么我将如何更改命令以便它只在编译命令中包含main.cpp?更好的是,如何手动指定整个命令字符串?
答案 0 :(得分:1)
从你的解释来看,你首先做错了。如果有多个cpp文件,则将每个文件编译为单个目标文件,然后将它们链接在一起。使用#include包含.cpp文件是错误的方法 - 这就是标题(.h)文件的用途。
头文件(.h)包含在C ++文件(.cpp)中定义的代码部分的声明。通过包含标题,您可以使用在别处定义的函数。其他地方可能是另一个目标文件(.o或.obj - 由gcc -c something.cpp创建)或库文件(.lib)。当你有3个cpp文件,a.cpp,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>
其中c.h包含b需要使用的函数声明。
当您在源代码中执行#include "b.cpp"
之类的操作时,它几乎总是完全错误。