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文件中,就能运行成功
#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头文件就能成功,是啥问题?的主要内容,如果未能解决你的问题,请参考以下文章