在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
呢?
答案是使用 autoconf
和 automake
工具。
首先 写一个 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