参考《后台开发 · 核心技术与应用实践》徐晓鑫 著
1、编译与链接
编译与连接过程可以分为4个步骤;预处理–>编译–>汇编–>链接
g++ -E main.cpp -o main.i #-E是编译选项,表示只进行预编译,此时main.i是预处理之后的文件,如宏定义被展开
g++ -S main.i -o main.s #-S 此时main.s为汇编语言
g++ -c main.s -o main.o #或者as main.s -o main.o
g++ *.o -o main #链接所有的.o文件或者库文件,生成可执行程序
2、链接库
静态库 | 动态库 | |
---|---|---|
作用时机 | 程序载入内存之前完成所有的链接操作 | 程序载入内存后再进行链接操作 |
3、demo
创建5个文件,add.cpp、add.h、sub.cpp、sub.h、main.cpp
代码:
文件1:add.cpp
#include "add.h"
int Add::add(int a,int b)
{
return a + b;
}
文件2:add.h
#ifndef _ADD_H__
#define _ADD_H__
class Add
{
public:
int add(int a,int b);
};
#endif
文件3:sub.cpp
#include "sub.h"
int Sub::sub(int a,int b)
{
return a - b;
}
文件4:sub.h
#ifndef _SUB_H__
#define _SUB_H__
class Sub
{
public:
int sub(int a,int b);
};
#endif
文件5:main.cpp
#include <stdio.h>
#include "add.h"
#include "sub.h"
#define DBG_PRINT (printf("[%s %s %s:%d] ",__DATE__,__TIME__,__FUNCTION__,__LINE__),printf)
int main(int argc,char *argv[])
{
DBG_PRINT("hello Makefile\n");
Add *a = new Add();
Sub *s = new Sub();
DBG_PRINT("10 + 5 = %d\n",a->add(10, 5));
DBG_PRINT("10 - 5 = %d\n",s->sub(10, 5));
return 0;
}
上述文件main.cpp中调用了加减两个方法,所以编译步骤如下
@ubuntu:~/share/01code/myMakefile$ g++ -c add.cpp
@ubuntu:~/share/01code/myMakefile$ g++ -c sub.cpp -o sub.o
@ubuntu:~/share/01code/myMakefile$ g++ -c main.cpp
@ubuntu:~/share/01code/myMakefile$ g++ *.o -o main
@ubuntu:~/share/01code/myMakefile$ ./main
[Jan 10 2022 07:56:46 main:9] hello Makefile
[Jan 10 2022 07:56:46 main:14] 10 + 5 = 15
[Jan 10 2022 07:56:46 main:15] 10 - 5 = 5
4、静态库
将上述生成的.o文件压缩成静态库
-L./ # -L 表示指定链接的静态库路径,./表示当前路径
-lmymath #-l表示链接的库名,这里不用加lib和后缀.a,g++编译器会自动添加
@ubuntu:~/share/01code/myMakefile$ ls
add.cpp add.h add.o main main.cpp sub.cpp sub.h sub.o
@ubuntu:~/share/01code/myMakefile$ ar -cr libmymath.a add.o sub.o
@ubuntu:~/share/01code/myMakefile$ ls
add.cpp add.h add.o libmymath.a main main.cpp sub.cpp sub.h sub.o
@ubuntu:~/share/01code/myMakefile$ ar tv libmymath.a
rw-r--r-- 0/0 1256 Dec 31 16:00 1969 add.o
rw-r--r-- 0/0 1256 Dec 31 16:00 1969 sub.o
@ubuntu:~/share/01code/myMakefile$ g++ -o main main.cpp -L./ -lmymath
@ubuntu:~/share/01code/myMakefile$ ./main
[Jan 10 2022 08:01:50 main:9] hello Makefile
[Jan 10 2022 08:01:50 main:14] 10 + 5 = 15
[Jan 10 2022 08:01:50 main:15] 10 - 5 = 5
5、动态库
-Wl,-rpath=./ 指定动态库在当前目录下搜索,不然会找不到动态库报错
@ubuntu:~/share/01code/myMakefile$ g++ -fPIC -c sub.cpp
@ubuntu:~/share/01code/myMakefile$ g++ -fPIC -c add.cpp
@ubuntu:~/share/01code/myMakefile$ g++ -shared -o libmymath.so *.o
@ubuntu:~/share/01code/myMakefile$ g++ -o main main.cpp -L. -lmymath -Wl,-rpath=./
@ubuntu:~/share/01code/myMakefile$ ./main
[Jan 10 2022 08:46:23 main:9] hello Makefile
[Jan 10 2022 08:46:23 main:14] 10 + 5 = 15
[Jan 10 2022 08:46:23 main:15] 10 - 5 = 5
@ubuntu:~/share/01code/myMakefile$ g++ -o main main.cpp -L. -lmymath
@ubuntu:~/share/01code/myMakefile$ ./main
./main: error while loading shared libraries: libmymath.so: cannot open shared object file: No such file or directory