2016-10-06 171 views
0

因此,这里是我的工作回购:https://github.com/Garuda1/unixlib如何在Makefile中实现“make install”?

我想知道我的编译LIB(unixlib.a),并在我的头(unixlib.h)应以能够使用的lib(下Linux的x86或Linux的x86_64的)简单地通过编译:

$ gcc my_source.c -lunixlib 

和包括在my_source.c头。

我想我补充这样做是为了Makefile

install: 
    mv $(NAME).a $(LIB_PATH) 
    mv unixlib.h $(HEADER_PATH) 

,但我不知道是什么$(LIB_PATH)$(HEADER_PATH)是...

+0

为什么'mv'?这会从源目录中删除头文件。 'cp'或'install'通常在这里使用。目标路径通常是'$(prefix)/ lib'和'$(prefix)/ include';你想在哪里安装你的文件? –

+0

我想将它们安装到他们需要去的地方,基本上如果我创建'foo.c',其中''#include ',我希望能够用'gcc -lunixlib foo.c'编译它' – Garuda1

+0

“他们需要去的地方“是依赖于发行版/风格,并且在你的情况下,默认为gcc的Include/Lib路径。你应该用'prefix =/usr/local'写成'/ usr/local'作为* prefix *,意思是'LIB_PATH = $(prefix)/ lib'和'HEADER_PATH = $(prefix)/ include',就像Karsten Koop写的一样。 。 '/ usr /'通常由distros软件包管理器和'/ usr/local'管理,通常用于“本地安装” - [你可以在FHS中阅读](https://en.wikipedia.org/)。维基/ Filesystem_Hierarchy_Standard)。建设者可以使用'make install prefix =/home/example'来覆盖它 – makadev

回答

2

通常在UNIX系统中的头去$PREFIX/include,库文件去$PREFIX/lib,其中PREFIX可以是/usr/usr/local或其他。在Linux中,如果您将库安装到这些目录中,那么只需要就可以找到gcc

PREFIX环境变量通常被各种构建工具用于提供该前缀。

我也推荐使用DESTDIR变量,它至少被Debian打包工具使用。

因此,makefile文件是这样的:

#PREFIX is environment variable, but if it is not set, then set default value 
ifeq ($(PREFIX),) 
    PREFIX := /usr/local 
endif 

install: unixlib.a 
    install -d $(DESTDIR)$(PREFIX)/lib/ 
    install -m 644 unixlib.a $(DESTDIR)$(PREFIX)/lib/ 
    install -d $(DESTDIR)$(PREFIX)/include/ 
    install -m 644 unixlib.h $(DESTDIR)$(PREFIX)/include/ 

注意,install -d ...用来以防万一,如果目录中不提供DESTDIR例如存在。

您还可以看看我的非递归模板make找到一些线索:https://github.com/igagis/prorab/blob/master/src/prorab.mk