之前一直用IDE来开发软件, 对g++下面的类的编译也是一知半解, 做实验很多也是采用g++ -o main main.cpp 之类的简单的测试
最近项目需要,研究对c++的编译和运行, 刚开始测试C++的特性, 并使用命令行式编译过程,下面记录一下最近2天的心得
需要测试如何编译一个c++类的过程,并逐渐完善。但是刚开始的时候就开始有问题出来了
以前一直采用
g++ -o main main.cpp
但是对于在main中调用一个类该如何编译呢
我的三个文件如下:
//A.h
#include <iostream>
using namespace std;
class A{
public:
A();
virtual ~A();
void test();
private:
int a;
};
//A.cpp
#include "A.h"
A::A(){
cout<< "A constructor"<<endl;
}
A::~A(){
cout<< "A destructor"<<endl;
}
void A::test(){
cout << "A test()" << endl;
}
//classTest.cc
#include <stdio.h>
#include "A.h"
int main(void){
A a;
a.test();
return 0;
}
之前一直认为只要#include这个头文件,就可以自动编译,原来是IDE帮你做的这个事情,(真是IDE用多了)
查了资料才知道, 编译过程包含:
⒈预处理,生成.i的文件
⒉将预处理后的文件转换成汇编语言,生成文件.s
⒊由汇编变为目标代码(机器代码)生成.o的文件
⒋连接目标代码,生成可执行程序
如果我想生产针对main的可执行程序,需要首先对类A进行编译并生成 .o文件,然后对.o文件进行连接生成可执行文件
所以要想生成执行程序,则首先对编译A
g++ -c A.cpp
生成了A.o, 然后编译classTest.c
g++ -c classTest.c
生成了classTest.o
最后一步链接
g++ -o classTest classTest.o A.o
然后就可以运行./classTest
但是每次对A和classTest进行修改,都要执行三遍上面的语句, 是不是太繁琐了
这个时候我就想起来我之前看过的makefile相关的资料,如果这个时候使用makefile,把
编译的规则都写到makefile里面, 则每次修改文件只要执行一次make即可
所以我有写了一个makefile(第一次想主动写个makefile)
classTest:classTest.o A.o
g++ -o classTest classTest.o A.o
classTest.o:classTest.c A.h
g++ -c classTest.c
A.o:A.h
g++ -c A.cpp
clean:
rm *.o
rm classTest
(当然makefile比较简陋,没有用变量,伪目标等等)
这样我们第一次编译c++使用命令行就结束了