g++编译单文件
1、/home/carl下创建一个c++的文件夹
mkdir -p /home/carl/c++
(加上-p防止上一级路径不存在)
2、新建一个main.cpp源代码文件,文件内容使用c++打印出自己的学号
gedit main.cpp
3、使用g++编译并链接main.cpp文件,只编译g++ -o main.o -c main.cpp (-o:指定生成可执行文件的名称 -c:只编译不链接,只生成目标文件。)
链接g++ -o myid main.o
运行./myid
g++编译多文件
1、新建两个文件,分别命名为func.cpp和func.h,分别写入如下内容
#include "func.h"
void print_func1(void)
{
cout<<"using func1—lin"<<endl;
}
#ifndef _FUNC_H
#define _FUNC_H
#include<iostream>
using namespace std;
void print_func1(void);
#endif
2、修改main.cpp文件,内容如下
#include "func.h"
int main(int argc,char** argv)
{
print_func1();
return 0;
}
3、使用g++编译并链接多个cpp和h文件
编译
g++ -o main.o -c main.cpp
g++ -o func.o -c func.cpp
链接
g++ -o myid main.o func.o
运行
./myid
Makefile编译普通工程
1、前面编译用的命令如下,替换用makefile来表示,形式如下
编译
g++ -o main.o -c main.cpp main.o:main.cpp
g++ -c main.cpp
shell命令
g++ -o func.o -c func.cpp func.o:func.cpp
g++ -c func.cpp
链接
g++ -o myid main.o func.o myid:func.o main.o
g++ -o myid func.o main.o
2、将上述命令写入名为Makefile的文件
3、在终端中打入
(1)make rm -f main.o
(2)make main.o rm -f main.o
(3)make func.o rm -f func.o
(4)make myid
观察(1)和(2)对应的输出结果,可以知道make和make main.o的效果是一致的
4、那么为了执行make就完成编译链接,就应该把最后一个目标拿到第一个,结果如下
5、经常在编译完成后我们经常需要清理中间文件,或者有时希望清理掉所有编译链接生成的文件,因此可以添加clean这个规则
Makefile编译带动态库工程
1、接下来介绍需要链接外部动态库工程的makefile的书写
当有些函数经常需要使用时,比如日志系统函数,我们可以把它封装成动态库或者静态库(这边可自行查找下动态库和静态库的区别)。
在例子中,我们将func.cpp和func.h这个功能函数封装成libfunc.so动态库
2、首先复制一份c++文件夹及目录下的文件,接着切换到c++so中将func.cpp编译成动态库
cp -r /home/carl/c++ /home/carl/c++so
cd /home/carl/c++so
g++ func.cpp -fPIC -shared -o libfunc.so
3、如图,运行完后,会出现一个libfunc.so文件,即我们需要的动态库
解锁命令
sudo chmod -R 777 /home/carl/c++so
4、接着以自己学号创建一个文件夹,将func.h和libfunc.so放入该文件夹下,此时完全可以将func.cpp这个文件删掉
5、接下来修改main.cpp文件,内容如下
#include "func.h"
int main(int argc,char** argv)
{
print_func1();
return 0;
}
5、我们需要修改makefile,在makefile修改中需要在编译的时候指向头文件,在链接的时候指向动态库,同时为了方便可采用shell中变量赋值的方式进行修改,最终的makefile如下(特别需要注意inc和libs这个路径到底要指向哪里)
利用cmake生成makefile
1、创建一个cmake的文件夹用来放置实验要用的文件,然后在cmake中将如下代码放入main.cpp文件中
mkdir cmake
gedit main.cpp
#include<iostream>
using namespace std;
int main(int argc,char** argv)
{
cout<<“lin”<<endl;
return 0;
}
2、创建CMakeLists.txt文件,并在文件内填入如下内容
PROJECT(myid)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
add_executable(myid main.cpp)
3、运行生成makefile运行cmake .
可以看见已经生成了makefile
4、剩下的就是编译和链接运行命令make -j8
1、利用cmake生成多文件工程的makefile
仿照makefile编译多文件工程的方式建立main.cpp func.cpp func.h三个文件