makefile 学习
1-helloWorld
2-calc
3,makefile中的变量
4, Makefile中的伪目标和模式匹配
5,Makefile 运行流程
保证目标是用最新的依赖生成的;
第一次完全编译,后面只编译最新的代码。
P7,Makefile 中编译动态连接库 .dll .so
动态链接库:好处是程序可以和库文件分离,可以分别发版,然后库文件可以被多处共享;
动态:运行时才加载 动态加载;
链接:指库文件和二进制程序分离,用某种特殊手段维护两者之间的关系;
库: 库文件 .dll .so
编译的动态库必须是 libxxx.so,比如 soTest.cpp --> libSoTest.so
编译动态库:g++ -shared -fPIC SoTest.cpp -o libSoTest.so
编译可执行文件:g++ -o test test.cpp -L./ -lSoTest (test.cpp必须放在动态链接库之前。g++ -o test -L./ -lSoTest test.cpp 这样错误)。
方法一:
注意:运行可执行文件时出错,是因为上面仅在编译时链接到了动态库,运行时找不到动态库,动态库的默认路径通常是/lib和/usr/lib,所以需要把当前动态库目录加载到库目录。
置当前目录加载so动态库:
- 临时设置:export LD_LIBRARY_PATH=./
- 当前用户永久设置:在~/.profile文件末尾加入两行:
LD_LIBRARY_PATH=./
export LD_LIBRARY_PATH
- 所有用户永久设置:/etc/profile文件末尾加入两行:
# set Current path for so library
LD_LIBRARY_PATH=./
export LD_LIBRARY_PATH
source /etc/profile 命令使/etc/profile立即生效
方法二:编译时指定了要依赖的动态库,但是运行时,找不到.so文件
LInux默认的动态库路径配置文件 是/etc/ld.so.conf、/etc/ld.so.conf.d/*.conf、/usr/local/lib、/usr/lib
把生成的文件拷贝到动态库配置文件就可以了!!!
P8,Makefile编译静态连接库
AR = ar rc —–生成静态库文件命令
要先生成.o文件,再生成libaTest.a 文件
g++ -c:只编译不链接,只生成目标文件。Makefile有三个非常有用的变量。分别是$@,$^,
<
代表的意义分别是:$
@
–目标文件,
$
–
所有的依赖文件,
<代表的意义分别是:$@–目标文件,$^–所有的依赖文件,
<代表的意义分别是:$@–目标文件,$–所有的依赖文件,<–第一个依赖文件。
链接静态链接库:-L:指定搜索目录,-l:指定动态库
P9,Makefile中通用部分做公共头文件
1,通配符
Make命令允许对文件名,进行类似正则运算的匹配,主要用到的匹配符是%。比如,假定当前目录下有 f1.c 和 f2.c 两个源码文件,需要将它们编译为对应的对象文件。
%.o: %.c
等同于下面的写法。
f1.o: f1.c
f2.o: f2.c
使用匹配符%,可以将大量同类型的文件,只用一条规则就完成构建。
2,“ = ”
make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
3, “ := ”
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
P11 Makefile中调用shell命令
P13,Makefile中的条件判断
P14,Makefile中的循环
P15, Makefile中的自定义函数
P16,Make install 的实现
make 的作用:1,将源文件编译成二进制可执行文件(包括各种库文件);
make install 的作用:2,创建目录,将可执行文件拷贝到指定目录(安装目录);
3,加全局可执行的路径;
4, 加全局的启停脚本
make clean的作用: 5,重置编译环境,删除无关文件;