linux下g++编译c++程序关于include的几个问题,应该都比较简单。谢谢
当前目录下有三个文件:Heads/Hello.h、Sources/Hello.cpp、MyFirst.cpp,内容如下://Heads/Hello.h#ifndefHel...
当前目录下有三个文件:Heads/Hello.h、Sources/Hello.cpp、MyFirst.cpp,内容如下:
//Heads/Hello.h
#ifndef HelloH
#define HelloH
class Hello
{
Hello();
void Display();
}
//Sources/Hello.cpp
#include "../Heads/Hello.h"
#include <iostream>
using namespace std;
Hello::Hello()
{
}
Hello::Display()
{
cout << "Hello world!\n" << endl;
}
//MyFirst.cpp
#include "Heads/Hello.h"
int main()
{
Hello theHello;
theHello.Display();
return 0;
}
开始编译:g++ MyFirst.cpp -o MyFirst
出错:
undefined reference to ''Hello::Hello(void)''
undefined reference to ''Hello::Display()''
在MyFirst.cpp中:将#include "Heads/Hello.h"改为#include "Sources/Hello.cpp"即可正常编译。
有几个问题:
1、我是第一次把类的定义和实现分开到两个文件,Heads和Sources这两个文件夹的名字起的好吗?一般用什么名字。
2、Sources/Hello.cpp文件中#include "../Heads/Hello.h"这句看着比较长。一般就是这么写还是有其他的什么办法呢?
3、main函数需要将#include "Heads/Hello.h"改为include "Sources/Hello.cpp"才能正常编译。但是我经常看见的main函数通常都是include .h 文件的,而不是.cpp文件。这么改有问题吗?
有什么办法仍然#include "Hello.h"但能正常编译?谢谢 展开
//Heads/Hello.h
#ifndef HelloH
#define HelloH
class Hello
{
Hello();
void Display();
}
//Sources/Hello.cpp
#include "../Heads/Hello.h"
#include <iostream>
using namespace std;
Hello::Hello()
{
}
Hello::Display()
{
cout << "Hello world!\n" << endl;
}
//MyFirst.cpp
#include "Heads/Hello.h"
int main()
{
Hello theHello;
theHello.Display();
return 0;
}
开始编译:g++ MyFirst.cpp -o MyFirst
出错:
undefined reference to ''Hello::Hello(void)''
undefined reference to ''Hello::Display()''
在MyFirst.cpp中:将#include "Heads/Hello.h"改为#include "Sources/Hello.cpp"即可正常编译。
有几个问题:
1、我是第一次把类的定义和实现分开到两个文件,Heads和Sources这两个文件夹的名字起的好吗?一般用什么名字。
2、Sources/Hello.cpp文件中#include "../Heads/Hello.h"这句看着比较长。一般就是这么写还是有其他的什么办法呢?
3、main函数需要将#include "Heads/Hello.h"改为include "Sources/Hello.cpp"才能正常编译。但是我经常看见的main函数通常都是include .h 文件的,而不是.cpp文件。这么改有问题吗?
有什么办法仍然#include "Hello.h"但能正常编译?谢谢 展开
2个回答
展开全部
你的问题问得非常好。
你遇到的问题是如何编译一个工程的问题。
实际上,从源代码到可执行文件,需要编译和链接两个步骤。
现在你的项目中有2个cpp文件,还有一个要包含的.h文件。在编译的时候,你需要先把2个cpp分别编译成.o文件,再把这些.o文件用链接器链接成一个可执行文件。
编译和链接程序都是g++,区别是 编译 的时候带 -c 参数。
你的项目应该象下面这样编译。
g++ -c -o MyFirst.o MyFirst.cpp
g++ -c -o Hello.o Hello.cpp
这样会生成两个编译出来的.o文件
然后用下面这样的命令进行链接。
g++ -o MyFirst MyFirst.o Hello.o
注意,这里没有了-c参数。 但是列出了所有的.o文件。就是告诉链接器把哪些.o链接起来,生成可执行文件。
这样就编译出了可执行文件MyFirst
当只有一个.cpp的时候,由于比较简单,编译和链接就可以通过一行命令就搞定。
象这样
g++ -o MyFirst MyFirst.cpp
g++会生成一个临时的.o,然后用这个.o链接成可执行文件MyFirst。
在你的项目里,当你用这个命令编译的时候,由于在链接的过程中找不到Hello的信息。所以链接器报错。以后你如果看到类似undefined reference to xxx,要意识到这个是链接器报错了。
当你修改成Include Hello.cpp时,相当于把Hello.cpp包含到MyFirst.cpp中了,也就成了一个cpp源文件,所以用你的编译命令能成功。
一般编译一个项目,我们会用Make系统来进行编译。写一个Makefile,定义出各个目标之间的依赖关系。由Make系统自动帮我们编译。这个你可以搜索一下这方面的资料。
至于你的第二个问题。include时太长了。g++编译时可以用 -I 参数指定搜索头文件的路径。然后你直接#include "Hello.h"就可以了。不用再给出路径信息了。
你遇到的问题是如何编译一个工程的问题。
实际上,从源代码到可执行文件,需要编译和链接两个步骤。
现在你的项目中有2个cpp文件,还有一个要包含的.h文件。在编译的时候,你需要先把2个cpp分别编译成.o文件,再把这些.o文件用链接器链接成一个可执行文件。
编译和链接程序都是g++,区别是 编译 的时候带 -c 参数。
你的项目应该象下面这样编译。
g++ -c -o MyFirst.o MyFirst.cpp
g++ -c -o Hello.o Hello.cpp
这样会生成两个编译出来的.o文件
然后用下面这样的命令进行链接。
g++ -o MyFirst MyFirst.o Hello.o
注意,这里没有了-c参数。 但是列出了所有的.o文件。就是告诉链接器把哪些.o链接起来,生成可执行文件。
这样就编译出了可执行文件MyFirst
当只有一个.cpp的时候,由于比较简单,编译和链接就可以通过一行命令就搞定。
象这样
g++ -o MyFirst MyFirst.cpp
g++会生成一个临时的.o,然后用这个.o链接成可执行文件MyFirst。
在你的项目里,当你用这个命令编译的时候,由于在链接的过程中找不到Hello的信息。所以链接器报错。以后你如果看到类似undefined reference to xxx,要意识到这个是链接器报错了。
当你修改成Include Hello.cpp时,相当于把Hello.cpp包含到MyFirst.cpp中了,也就成了一个cpp源文件,所以用你的编译命令能成功。
一般编译一个项目,我们会用Make系统来进行编译。写一个Makefile,定义出各个目标之间的依赖关系。由Make系统自动帮我们编译。这个你可以搜索一下这方面的资料。
至于你的第二个问题。include时太长了。g++编译时可以用 -I 参数指定搜索头文件的路径。然后你直接#include "Hello.h"就可以了。不用再给出路径信息了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |