linux 下的 autotools 使用

在Linux环境下,当拿到一份源码,安装过程通常简单如下:

./configure
make
make install

c project 源码中通常有个 configure 程序,确切来说他是一个shell脚本。他的作用就是检测当前操作系统和一些执行环境(比如依赖和编译器等),然后根据这些信息生成 Makefile 文件。

一般项目中不会有 Makefile ,通过configure 结合 Makefile.in 文件 生成 Makefile

有了 Makefile ,就可以 make && make install 了。

构建 configure 脚本 和 Makefile.in

如果自己的 c 项目,如何构建 configure 脚本和 Makefile.in 呢?
答案是使用 autoconfautomake 工具。

首先 写一个 m4sh 格式的文件 configure.ac

AC_INIT([helloworld], [0.1], [george@thoughtbot.com])
AM_INIT_AUTOMAKE
AC_PROG_CC
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

再写一个 Makefile.am 文件:

AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = helloworld
helloworld_SOURCES = main.c

接下来,先使用 aclocal 工具(aclocal 会自动扫描 configure.ac),生成 aclocal.m4 文件,这个文件定义了一些 macro 以便后面 automake 工具使用。
命令行输入:

aclocal

autoconf 根据 configure.ac 文件生成 configure脚本。
在命令行里输入:

autoconf

automake根据 Makefile.am 文件生成 Makefile.in 文件。
在命令行里输入:

automake --add-missing

安装程序

接下来就可以通过:

./configure

make

make install

完整项目例子

tmp.c

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void* threadfunc(void* arg) {
    printf("before malloc in thread \n");
    getchar();

    char* addr = (char*)malloc(100);
    printf("after malloc in thread \n");
    getchar();

    free(addr);
    printf("after free mem in threed \n");
    getchar();

    return (void*)(NULL);
}

int main(int argc, char* argv[]) {
    printf("hello world");
    printf("before malloc in main thread \n");
    getchar();

    char* addr = (char*)malloc(100);
    printf("after malloc in main \n");
    getchar();

    free(addr);
    printf("after free add in main \n");
    getchar();

    pthread_t t;
    int pc = pthread_create(&t, NULL, threadfunc, NULL);
    if (pc != 0) {
        printf("thread create faild\n");
        return -1;
    }

    void* s;
    int pj = pthread_join(t, &s);
    if (pj != 0) {
        printf("thread join faild\n");
        return -1;
    }

    return 0;
}

configure.ac

AC_INIT([helloworld], [0.1], [jianyongli@tencent.com]) 
AM_INIT_AUTOMAKE 
AC_PROG_CC 
AC_CHECK_LIB(pthread, pthread_create) 
AC_CONFIG_FILES([Makefile]) 
AC_OUTPUT 

Makefile.am

AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = helloworld
helloworld_SOURCES = tmp.c
展开阅读全文

没有更多推荐了,返回首页