C++项目 使用多文件,用两个cpp文件运行报错,而用标准的两个cpp和一个h头文件就能成功,是啥问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++项目 使用多文件,用两个cpp文件运行报错,而用标准的两个cpp和一个h头文件就能成功,是啥问题?相关的知识,希望对你有一定的参考价值。

//主函数lab015.cpp
#include <iostream>
#include "lab014.h"
using namespace std;
int main()

X testx1;
Y testy1;
Z testz1;

testy1.g(testx1);
cout<<testx1.Geti()<<endl;
testz1.f(testx1);
cout<<testx1.Geti()<<endl;
testz1.h(testx1);
cout<<testx1.Geti()<<endl;

system("Pause");


//lab014.cpp
#include <iostream>
using namespace std;
class X;
class Y

public:
void g(X &x1);

;
class X

public:

X();
X(int num);
int Geti();
friend class Z;
friend void Y::g(X &x1);//其他类的成员函数作为友元函数的函数声明
private:
int i;
;

class Z

public :
void f(X &x1);
void h(X &x1);
;
X::X()

i = 0;

X::X(int num)

i = num;

int X::Geti()

return i;

void Y::g(X &x1)

x1.i+=1;

void Z::f(X &x1)

x1.i+=5;

void Z::h(X &x1)

x1.i+=10;


//学C++的时候做的一个题,在主函数里面包含了lab014.cpp,里面实现类的定义和实现
//如果没有#include lab014.cpp,会报错说没有关于类的定义
//如果不包含lab014.cpp,又会报错说有重复的函数定义

//但如果把类定义放在一个h文件里,把类实现放在cpp文件中,就能运行成功

厄,本来就该如此啊,.h文件是做定义的,cpp是源文件。。
#include 指令是用来包含头文件的追问

但我在看#include 这个指令的时候,书上说可以包含cpp文件又是怎么回事呢?

追答

我看了一下编译器,原来不分.h .cpp 包含文件与后缀无关。。
GCC如此,不知道你用哪个编译器。

追问

我用的VS。。还没怎么弄清楚这个问题

追答

哪本书...这个可能与编译器标准有关..gcc 4.4.0 编译通过了

追问

那我下个gcc试试吧。。

参考技术A .h文件里放的是声明(如:类的声明等),cpp是实现在.h中的声明

在 Eclipse 下为 C++ 项目运行 make

【中文标题】在 Eclipse 下为 C++ 项目运行 make【英文标题】:Running make for a C++ project under Eclipse 【发布时间】:2011-02-05 16:04:51 【问题描述】:

我正在使用 g++ 和 automake 在 Ubuntu 10.10 下开发 C++ 应用程序。对于这个程序,我有两个 cpp 文件(main.cpp 和 forward.cpp,后者是一个测试类)和 forward.h;我也有以下makefile:

main: \
forward.o
    g++ -fPIC -g -Wall -D_REENTRANT  -fno-exceptions  -I/usr/local/Aria/include/ -L/usr/local/Aria/lib -lAria -lpthread -ldl -lrt \
    -o simple_controller \
    main.cpp \
    forward.o

%.o : %.cpp
    g++ -c -g -Wall -D_REENTRANT -fno-exceptions  -I/usr/local/Aria/include/ $< -o $@

clean:
    rm -fv *.o
    rm -fv */*.o

当我将所有这四个文件复制到同一目录并从命令行 (bash) 调用“make”时,将调用 g++,我的程序将被正确编译。

好的,现在我想在 Eclipse 下实现同样的效果。所以我在Eclipse下新建了一个非托管C++项目,这样我就可以提供自己的makefile了(和上面列出的一样)。不幸的是,当我现在在 Eclipse 下使用“全部构建”选项时,我可以看到以下控制台输出:

make 
make: *** No rule to make target `forward.o', needed by `main'.  Stop.

由于我是 Linux 下 C++ 开发的新手,使用 g++ 和 makefile,我不太了解这个问题。我认为正确编译我的应用程序所需的一切都写在 makefile 中,因为它可以在命令行中完美运行。但似乎我无法将相同的 makefile 1:1 复制到我的 Eclipse 项目中。

有什么我在这里缺少的想法吗? 提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

当您构建项目时,eclipse 正在执行 make all 命令,因此您需要修改项目以使用 main 而不是 all 用于目标 eclipse 使用,或者将 all 规则添加到引用的 makefile回到主要规则。另外我会在 clean 步骤下添加一个命令来删除可执行文件。

修改后的 Makefile:

main: \
    forward.o
    g++ -fPIC -g -Wall -D_REENTRANT  -fno-exceptions  -I/usr/local/Aria/include/ -       L/usr/local/Aria/lib -lAria -lpthread -ldl -lrt \
    -o simple_controller \
    main.cpp \
    forward.o

%.o : %.cpp
    g++ -c -g -Wall -D_REENTRANT -fno-exceptions  -I/usr/local/Aria/include/ $< -o $@

clean:
    rm -fv *.o
    rm -fv */*.o
    rm -fv simple_controller

all: main

【讨论】:

不幸的是,这并没有帮助,因为我已经发现 Eclipse 默认使用“make all”作为目标,所以我从项目属性中删除了“all” -> C/C++ Build - > 选项卡“行为”,输入框“构建(增量构建)”。当我再次在这里输入“all”并根据您的建议修改makefile时,我会得到与原始帖子相同的错误(这次在第一行使用“make all”) @Matthias:不知道出了什么问题,因为我在我的 fedora 14 系统(我目前没有 Ubuntu VM)上通过执行以下操作对其进行了测试:1)创建一个新的空白项目。 2)通过处理您提供的 Makefile 创建 Makefile(重新格式化,以便不是目标的每一行都以选项卡开头) 3)创建一个简单的 main.cpp 和 forward.cpp 文件。 4) 删除对 /usr/local/Aria/* 的引用,因为它们与我的测试无关。 5) 将项目转换为 C++ Makefile 项目。 6) 添加了所有目标 7) 进行了构建并且一切正常。【参考方案2】:

好的,我现在发现了问题 - Eclipse 将 makefile 放入另一个目录,而不是所有源代码文件所在的“src”文件夹。所以make没有找到编译需要的.cpp和.h文件。现在我得到了这样的结果:

...
forward.o : ../src/forward.cpp ../src/forward.h
...

有没有办法告诉 make 即使没有明确说明它也应该查看文件夹 ../src?

【讨论】:

【参考方案3】:

您可以使用 -C 选项告诉 make 更改目录。

例如,如果您的源代码位于 src/ 并且您的 makefile 位于 src/ 的父目录中,您可以这样做:

make -C ..

注意 - 从未专门使用过 Eclipse,但通常有一种方法可以在 IDE 选项的某处向构建命令中添加命令行开关和选项。

(根据您的问题的第二部分回答,您指定问题是生成文件与您的源文件位于不同的文件夹中。)

【讨论】:

以上是关于C++项目 使用多文件,用两个cpp文件运行报错,而用标准的两个cpp和一个h头文件就能成功,是啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

visual c++ 2008中如何运行一个 .cpp文件

visual c++ 2008中如何运行一个 .cpp文件

使用vs2019如何只编译一个c++文件

如何在 C++ 项目中运行多 cpp?

用visual c++ 2008 打开一个.cpp文件怎么运行它?

请教 如何运行含多个cpp的一个c++项目里面的一个cpp