Makefile知识整理

40 篇文章 1 订阅
4 篇文章 0 订阅

一、gcc -l参数和-L参数用法含义

1、-l 的用法

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了(即gcc -lm)

2、-L 的用法

当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)

放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest(若库文件就在当前编译目录下,则链接参数就是-L.)

二、动态库软链接

1、硬链接(hard link)
命令ln sourse dest可以为文件source创建一个名为dest的硬链接。两个文件指向同一块数据块,所以对任意文件修改都会反映到其它所有被链接的文件上。如果source被删除了,dest仍然有效,可以被使用。

2、软链接(symbolic link)
命令ln -s source dest可以为文件source创建一个名为dest的软链接。软链接类似于Windows上的快捷方式。一旦source不存在了,那么dest的文件也会失效。

大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.so.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,
如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so

三、动态库查找路径LD_LIBRARY_PATH

使用动态库的应用程序在运行前需要设置动态库查找路径,设置方法为export  LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX

四、-include和-I参数

-include用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现,-include参数很少用。-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。

五、makefile中调用其它makefile

有时Makefile中需要先调用库文件的makefile生成.a或.so,再生成最终文件,调用方法如下
1、make其它目录(./test)下的Makefile
$(MAKE) -C ./test/
2、make clean
make -C ./test/ clean

六、Makefile编写

TARGET = librunoob.so

all:$(TARGET)

CC = gcc
CXX = g++-4.8
STRIP = strip
ARMCC = arm-linux-gcc
ARMSTRIP = arm-linux-strip

#where to install
INSTDIR = bin

#where are include files kept
INCLUDE = -I./

#CFLAGS  = -g -Wall –lstdc++
CFLAGS = -g -Wall
CXXFLAGS = -g -Wall -std=c++11

LDFLAGS = -L./

RANLIB = ranlib

SOURCES = runoob_main.cpp runoob_base_func.cpp

C_SRCS = $(filter %.c, $(SOURCES))
CPP_SRCS = $(filter %.cpp, $(SOURCES))

C_OBJS = $(C_SRCS:%.c=release/%.o)
CPP_OBJS = $(CPP_SRCS:%.cpp=release/%.o)

$(C_OBJS):release/%.o:%.c
	@mkdir -p release
	@mkdir -p $(dir $@)
	$(CXX) $(CXXFLAGS) -shared -fPIC -c $^ -o $@
	
$(CPP_OBJS):release/%.o:%.cpp
	@mkdir -p release
	@mkdir -p $(dir $@)
	$(CXX) $(CXXFLAGS) -shared -fPIC -c $^ -o $@
	
$(TARGET):$(C_OBJS) $(CPP_OBJS)
	$(CXX) -shared -fPIC -o $@ $^
	#$(AR) r $@ $^
	#$(RANLIB) $@
	mkdir -p $(INSTDIR)/debug
	cp $@ $(INSTDIR)/debug
	mkdir -p $(INSTDIR)/release
	#$(STRIP) $@
	cp $@ $(INSTDIR)/release
	
clean:
	@echo "cleanning project.."
	-rm -rf release
	-rm -rf $(INSTDIR)
	-rm -rf $(TARGET)
	@echo "clean completed"
	

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。 现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。 在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。 ——陈皓

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值