前言
在Linux下,编译和链接需要用Makefile,而写好一个Makefile可不容易,写出一个规范的Makefile更是麻烦。我们可以利用autoconf来生成一个Makefile,尤其在大型工程里,能省去很多麻烦。
这里我会用一个工程来说明怎么做,有一些步骤不是必须的,但是如果你看不出来哪些步骤不是必须的,最好跟着一步步走,因为某些步骤省略了,代码也需要做出相应修改(如修改路径等)。
步骤
首先安装autoconf
sudo apt-get install autoconf
新建一个项目文件夹(例如:joy)
mkdir joy
cd joy
在里面新建两个文件夹 lib 和 src ,用于放工程的库文件和源文件。
mkdir lib
mkdir src
如下图所示:
进入lib文件夹,新建一个头文件,如:haha.h,随便声明个函数吧。
cd lib
gedit haha.h
//haha.h #include <stdio.h> void printhaha();
进入src文件夹,新建一个C文件,如:haha.c,实现头文件的函数;新建一个C文件,如:main_code.c,编写主函数。
cd ../src
gedit haha.c
//haha.c #include "../lib/haha.h" void printhaha() { printf("haha\n"); }
//main_code.c #include "../lib/haha.h" void main() { printhaha(); }
回到joy文件夹下,我们的工程文件都已经写好了
cd ..
运行autoscan生成configure.scan
autoscan
编辑configure.scan
gedit configure.scan
编辑之前的文件是这样的
#编辑之前的原始文件 # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([src/haha.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT
前缀AC指的是 AutoConf
AC_PREREQ不用管
AC_INIT里面填【包名】【版本】【BUG提交地址 也就是你的邮箱】
AC_CONFIG_SRCDIR里填源文件路径下的任意一个文件名,autoconf通过检测这个文件是否存在,判断这个路径是否正确,一般不用管
AC_CONFIG_HEADERS不用管
插入下面这句,automake阶段需要,否则会报错
AM_INIT_AUTOMAKE
前缀AM指的是 AutoMake
最后的AC_OUTPUT,改为AC_OUTPUT(Makefile)
修改完之后的文件如下所示:
#修改后的文件 # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT(hhh, 1.0, idontknow@666.com) AC_CONFIG_SRCDIR([src/haha.c]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile)
保存,并将configure.scan重命名为configure.ac
新建Makefile.am
gedit Makefile.am
输入以下代码
AUTOMAKE_OPTIONS= foreign subdir-objects bin_PROGRAMS=test_prj test_prj_SOURCES= lib/haha.h src/haha.c src/main_code.c
AUTOMAKE_OPTIONS后面是automake的执行选项,用空格隔开;
foreign指的是只检测必须的文件;
subdir-objects指的是编译生成的.o文件可以放在子路径(跟源文件放一起),没有这个选项的话,所有.o文件都会放在工程根目录下;
bin_PROGRAMS 后面的名字是 生成的可执行二进制文件名
可以有多个 bin_PROGRAMS ,但每个 bin_PROGRAMS 都需要有相对应的 xxx_SOURCES ;
xxx_SOURCES 是 可执行文件xxx的依赖项,包括头文件,源文件等
用aclocal生成aclocal.m4文件
aclocal
用autoconf生成configure文件
autoconf
用autoheader生成config.h.in
autoheader
用automake生成Makefile.in,需要加上 –add-missing使其自动加上缺省文件
automake --add-missing
然后我们这个软件就做好了,可以整个包拿去上传github或者开源论坛了。
别人下载了我们的源码包之后怎么编译链接可执行文件呢?或者说我们怎么编译链接我们的可执行文件呢?
以下是源码安装的一般步骤,也是我们编译链接的步骤
首先生成Makefile
./configure
然后make
make
现在我们可以看见,可执行文件 test_prj 已经被生成出来了
运行一下,结果如下:
结果是正确的。
进入src目录下,我们发现多了两个文件
这就是AUTOMAKE_OPTIONS里subdir-objects的作用,少了这句话,这两个.o文件就会出现在你的根目录下。如果很不幸你的工程比较大,有同名文件的话,那就可能出现很严重的后果了,所以这句话建议加上。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]