编译及Makefile

Makefile

Makefie中.PHONY的作用。PHONY“伪造”的意思。
在Makefile中,.PHONY后面的target表示的也是一个伪造的target, 而不是真实存在的文件target,注意Makefile的target默认是文件。

$ cat -n Makefile1
     1    clean:
     2        rm -f foo
$ cat -n Makefile2
     1    .PHONY: clean
     2    clean:
     3        rm -f foo

在Makefile规则书写中,
target… : prerequisites …
command
target是由command执行后生成的文件名。
不会有文件生成的target使用.PHONY。比如clean。
strip

#$(strip <string> )
#名称:去空格函数——strip。
#功能:去掉<string>字串中开头和结尾的空字符,并将中间的多个连续空字符(如果有的话)合并为一个空字符。
#返回:返回被去掉空格的字符串值。
#说明: 空字符包括 空格,tab等不可显示的字符

#把字串" abc"开头的空格去掉,结果是"abc"。
str1 :=    abc
str2 := abc      
str3 := a   b  c      

all:
    @echo bound$(strip $(str1))bound
    @echo bound$(strip $(str2))bound
    @echo bound$(strip $(str3))bound

addprefix

语法:
$(addprefix <prefix>, <name-1>, <name-2>...<name-n>)
说明:
该函数将前缀 <prefix> 加到各个 <name> 的前面去。

EG:
CAMERA_BULID=/lib/CameraDriver/
TARGET_CAMERA=OV2710

输出为:/lib/CameraDriver/OV2710.o

info 相当于宏展开,而eval相当于运行/计算
如$(info including $(mk))
$(eval include $(mk)) makefile中include ‘.mk’ 文件,即执行该 ‘.mk’ 文件
https://blog.csdn.net/caohang103215/article/details/77619946
.ma .in Makefile
在这里插入图片描述
automake 读取 Makefile.am 来产生 Makefile.in,
configure 读取 Makefile.in 来产生 Makefile
configure 脚本通常由 autoconf 读取 configure.in 产生
还有aclocal…

出现aclocal missing的问题,可能是configure的问题,重新生成一下configure文件,中间可能需要安装一些包autoconf一类的。
重新生成configure文件
autoreconf -ivf

目的就是让程序员只写一个规则:.am文件/或.in文件
就能生成适合各种配置/平台的Makefiles。
如何根据configure.ac和Makefile.am为开源代码产生当前平台的Makefile

sysroot & prefix
–with-sysroot用来指定系统的root。如configure时指定–with-sysroot=/mnt/lfs,编译时需要安装一些包到/var/下,则实际安装位置是/mnt/lfs/var/下
该选项主要用于新系统(比如LFS)构建或交叉编译。比如你的LFS的root在/mnt/lfs,那么configure时指定–with-sysroot=/mnt/lfs,编译器就会使用/mnt/lfs上的header和lib,而不是host上的。交叉编译器也会设定sysroot,避免搜索默认的header和lib路径。可以写个最小程序然后gcc -v main.c,如果编译器的sysroot非默认,就会打印出sysroot路径。

prefix用来指定make install的安装目录。比如你不想把软件安装在/(/bin和/lib)或/usr(/usr/bin和/usr/lib),而是想安装到/usr/local(/usr/local/bin和/usr/local/lib),就可以指定–prefix=/usr/local。

sysroot和prefix组合使用,其对路径的效果将叠加。

make clean&distclean
make clean仅仅是清除之前编译的可执行文件及配置文件。
而make distclean要清除所有生成的文件。

pkg-config
https://blog.csdn.net/newchenxf/article/details/51750239
pkg-config是一个linux下的命令,用于获得某一个库/模块的所有编译相关的信息。

pkg-config opencv –libs –cflags

结果

-I/usr/include/opencv
/usr/lib/x86_64-linux-gnu/libopencv_calib3d.so /usr/lib/x86_64-linux-gnu/libopencv_contrib.so /usr/lib/x86_64-linux-gnu/libopencv_core.so /usr/lib/x86_64-linux-gnu/libopencv_features2d.so /usr/lib/x86_64-linux-gnu/libopencv_flann.so /usr/lib/x86_64-linux-gnu/libopencv_gpu.so /usr/lib/x86_64-linux-gnu/libopencv_highgui.so /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so /usr/lib/x86_64-linux-gnu/libopencv_legacy.so /usr/lib/x86_64-linux-gnu/libopencv_ml.so /usr/lib/x86_64-linux-gnu/libopencv_objdetect.so /usr/lib/x86_64-linux-gnu/libopencv_ocl.so /usr/lib/x86_64-linux-gnu/libopencv_photo.so /usr/lib/x86_64-linux-gnu/libopencv_stitching.so /usr/lib/x86_64-linux-gnu/libopencv_superres.so /usr/lib/x86_64-linux-gnu/libopencv_ts.so /usr/lib/x86_64-linux-gnu/libopencv_video.so /usr/lib/x86_64-linux-gnu/libopencv_videostab.so
-lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab

所有用opencv的其他程序,在编译时,只需要写“pkg-config opencv –libs –cflags”,而不需要自己去找opencv的头文件在哪里,要链接的库在哪里!
如果你写了一个库,不管是静态的还是动态的,要提供给第三方使用,那除了给人家库/头文件,最好也写一个pc文件,这样别人使用就方便很多,不用自己再手动写依赖了你哪些库,只需要敲一个”pkg-config [YOUR_LIB] –libs –cflags”。

pkg-config的信息从哪里来?
很简单,有2种路径:
第一种:取系统的/usr/lib下的所有*.pc文件。
第二种:PKG_CONFIG_PATH环境变量所指向的路径下的所有*.pc文件。

cmake与autotools用于生成makefile。

CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。
通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。

如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。

arm32及64交叉编译器通常名
32位编译器通常:gcc-arm-linux-gnueabihf
64位编译器通常:gcc-aarch64-linux-gnu

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值