****************************************
author: hjjdebug
date: 2015-11-09 11:33:43
automake 使用库文件
****************************************
--------------------
1. 准备素材.
--------------------
a. mkdir hello; //创建hello 目录
b. cd hello; mkdir src; mkdir lib; // 在hello 下创建src 和 lib 两个目录
c. 在lib 目录下创建sayHello.h, sayHello.c, 在src 目录下创建main.c
其中main.c 会调用lib目录下的sayHello 函数
具体代码:
~/hello$ ls lib
sayHello.c sayHello.h
~/hello$ cat lib/sayHello.h
#ifndef _HELLO_H
#define _HELLO_H
void sayhello();
#endif
~/hello$ cat lib/sayHello.c
#include <stdio.h>
#include "sayHello.h"
void sayhello()
{
printf("hello\n");
}
~/hello$ cat src/main.c
#include <stdio.h>
#include "sayHello.h"
int main(int argc, char *argv[])
{
sayhello();
}
--------------------
2.
创建Makefile.am;
lib/Makefile.am;
src/Makefile.am,
内容如下:
--------------------
~/hello$ cat Makefile.am
AUTOMAKE_OPTIONS=foreign
SUBDIRS=lib src
~/hello$ cat lib/Makefile.am
AUTOMAKE_OPTIONS=foreign
noinst_LIBRARIES=libmytest.a
libmytest_a_SOURCES=sayHello.h sayHello.c
~/hello$ cat src/Makefile.am
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=main.c
hello_LDADD=../lib/libmytest.a
#INCLUDES = -I../lib
AM_CPPFLAGS = -I../lib
AUTOMAKE_OPTIONS 是Automake 的选项.
执行Automake 时,会检查目录下是否存在标准 GNU 软件中
应具备的文件,例如 'NEWS'、'AUTHOR'、 'ChangeLog' 等文件。
设置为foreign 时,Automake 会改用一般软件的标准来检查。
如果不加这句的话,需要在autoconf之前,先执行touch NEWS README AUTHORS ChangeLog 来生成'NEWS'、'AUTHOR'、 'ChangeLog' 等文件
noinst 表示生成的是静态库,不需要make install ,直接制定它的位置和名字就可以使用。
可执行文件名hello,是在当前目录下,如指定路径让它和源代码分开,如/root/test 目录下。写法为:
bin_PROGRAMS=/root/test/hello,后面的第三、四行也相对应地变为:
_root_test_hello_SOURCES=hello.c
_root_test_hello_LDADD=../lib/libmytest.a
--------------------
3.
autoscan;
mv configure.scan configure.ac;
vim configure.ac.
修改为如下形式
--------------------
~/hello$ cat configure.ac
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([hello], [1.0], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([src/main.c])
#AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE() # manully add
# Checks for programs.
AC_PROG_CC
AC_PROG_RANLIB # manully add
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_FILES([Makefile
lib/Makefile
src/Makefile])
AC_OUTPUT
--------------------
4. aclocal, autoconf
5. automake -a //生成Makefile.in
6. ./configure //生成Makefile
7. make // 编译。
--------------------
注意问题:
注意书写语法: AUTOMAKE_OPTIONS, SUBDIRS, SOURCES, LDADD, CFLAGS
AM_INIT_AUTOMAKE, AC_PROG_RANLIB
这是个简单的示例,注意从其它开源项目中学习,automake就可以登堂入世了.
其他像动态库链接,其它关键字等,通过学习可以得到