linux Make install

make install的实现

make                #1
make install        #2 3 4
make clean          #5

1)将源文件编译成二进制可执行文件(包含各种库文件)

2) 创建目录,将可执行文件拷贝到指定目录(安装目录)

3) 加载全局可执行的路径

4) 加全局的启停脚本

5) 重置编译环境,删除无关文件

例:在一个目录下新建一个名为main.c的C程序源文件:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char * argv[])
{
    int i = 0;
    while (1){
        i++;
        printf("main-running--%d\n",i);
        fflush(stdout);
        sleep(1);
    }
    return 0;
}

在相同目录下,新建一个Makefile文件,这个Makefile能够实现make,make install和make clean功能,其内容如下:

TARGET:=main
OBJS:=$(TARGET).o

INSTALL_PATH:=/tmp/local
USR_LOCAL_PATH:=/usr/local/bin
LOG:=/tmp/local/main.log


$(TARGET):$(OBJS)

install:
        if [ -d $(INSTALL_PATH) ];\
        then    echo "$(INATALL_PATH) exists";\
        else \
                mkdir -p $(INSTALL_PATH);\
                cp $(TARGET) $(INSTALL_PATH);\
                ln -s $(INSTALL_PATH)/$(TARGET) $(USR_LOCAL_PATH)/$(TARGET);\
                if [ ! -f $(LOG) ];\
                then touch $(LOG) && echo "Create Log file:$(LOG)" || (echo "cannot create $(LOG) file" && exit 1);\
                else \
                        echo " $(LOG) file already exits";\
                fi;\
                echo "$(TARGET)>$(LOG) &">$(USR_LOCAL_PATH)/$(TARGET)_start;\
                echo "killall $(TARGET)">$(USR_LOCAL_PATH)/$(TARGET)_stop;\
                chmod +x $(USR_LOCAL_PATH)/$(TARGET)_start;\
                chmod +x $(USR_LOCAL_PATH)/$(TARGET)_stop;\
        fi


clean:
        $(RM) -r $(INSTALL_PATH)
        $(RM) *.o $(TARGET) $(USR_LOCAL_PATH)/$(TARGET) $(LOG) $(USR_LOCAL_PATH)/$(TARGET)_start \
                $(USR_LOCAL_PATH)/$(TARGET)_stop


.PHONY:clean install

以上内容解析:

1) 指定编译要生成的可执行文件名称为main,它依赖的对象文件为main.o。

2) make install执行时, INSTALL_PATH指定的路径不存在,则创建这个路径,并且把main从当前路径复制到INSTALL_PATH指定目录下,并且在USR_LOCAL_PATH指定路径下新建一个软连接main指向这个程序的安装路径中的main程序。如果LOG指定的文件存在,则新建一个此名称的文件。在/usr/local/bin目录下新建两个文件main_start和main_stop,其内容分别为main>/tmp/local/main.log &和killall main,作用分别是用于后台启动main以及结束main程序的。chmod是将main_start和main_stop两个脚本赋予执行权限。

3) make clean:用于清除make以及make install生成的文件和目录。

执行make && make install命令:

[root@main-machine d9]# make && make install
g++    -c -o main.o main.cpp
cc   main.o   -o main
if [ -d /tmp/local ];\
then    echo " exists";\
else \
        mkdir -p /tmp/local;\
        cp main /tmp/local;\
        ln -s /tmp/local/main /usr/local/bin/main;\
        if [ ! -f /tmp/local/main.log ];\
        then touch /tmp/local/main.log && echo "Create Log file:/tmp/local/main.log" || (echo "cannot create /tmp/local/main.log file" && exit 1);\
        else \
                echo " /tmp/local/main.log file already exits";\
        fi;\
        echo "main>/tmp/local/main.log &">/usr/local/bin/main_start;\
        echo "killall main">/usr/local/bin/main_stop;\
        chmod +x /usr/local/bin/main_start;\
        chmod +x /usr/local/bin/main_stop;\
fi
Create Log file:/tmp/local/main.log

运行main_start,用tail -f /tmp/local/main.log查看main.log的内容,每秒钟,文件多一行:

[root@main-machine d9]# main_start
[root@main-machine d9]# tail -f /tmp/local/main.log
main-running--12
main-running--13
main-running--14
main-running--15
main-running--16
main-running--17
main-running--18
main-running--19
main-running--20
main-running--21
main-running--22
main-running--23
main-running--24

用ps -f查看当前运行的进程,当前有一个名称为main的进程正在运行:

[root@main-machine d9]# ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
root      473109  469614  0 14:47 pts/8    00:00:00 su
root      473115  473109  0 14:47 pts/8    00:00:00 bash
root      474988       1  0 16:04 pts/8    00:00:00 main
root      474997  473115  0 16:05 pts/8    00:00:00 ps -f

执行main_stop,用ps -f查看当前运行的进程,刚才运行的main进程,消失了:

[root@main-machine d9]# ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
root      473109  469614  0 14:47 pts/8    00:00:00 su
root      473115  473109  0 14:47 pts/8    00:00:00 bash
root      475002  473115  0 16:05 pts/8    00:00:00 ps -f

用tail -f /tmp/local/main.log查看文件变化,其内容也不发生变化了。

执行make clean清除make和make install生成的文件和目录:

[root@main-machine d9]# make clean
rm -f -r /tmp/local
rm -f *.o main /usr/local/bin/main /tmp/local/main.log /usr/local/bin/main_start \
        /usr/local/bin/main_stop

main_start,main_stop脚本,main程序以及对象文件,都被删除了:

[root@main-machine d9]# main_stop
bash: /usr/local/bin/main_stop: No such file or directory
[root@main-machine d9]# main_start
bash: /usr/local/bin/main_start: No such file or directory
[root@main-machine d9]# ls
main.cpp  Makefile
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值