4.1 编译链接

参考《后台开发 · 核心技术与应用实践》徐晓鑫 著

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值