爱悠闲 > Autoconf使用范例

Autoconf使用范例

分类: 编码  |  标签: gtk,makefile,语言,signal,工具,compiler  |  作者: onfoot 相关  |  发布日期 : 2015-09-24  |  热度 : 25°

<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } H3 { margin-bottom: 0.21cm } H3.western { font-family: "Bitstream Vera Sans", sans-serif } H3.cjk { font-family: "Bitstream Vera Sans"; font-style: normal } H3.ctl { font-family: "Bitstream Vera Sans" } A:link { so-language: zxx } -->

Autoconf 使用范例

 

1 ,最简单程序编译

 

1) 首先编写了源代码test.c, 如下:

int main()

 

{

printf("hello world!/n");

 

return 0;

 

}

2) 生成configure.in 或者configure.ac

运行autocan 生成configure.scan ,稍作修改,事实上只修改了两处。

一处是 AC_INIT ,定义包名,版本号和著作人。

另一处是添加了AM_INIT_AUTOMAKE ,这个是automake 工具的宏,有兴趣可以google 一下。

 

AC_PREREQ([2.63])

 

AC_INIT([hello], [0.10], [zhongsc@thunderst.com])

 

AM_INIT_AUTOMAKE(foreign)

 

AC_CONFIG_SRCDIR([test.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_CONFIG_FILES([Makefile])

 

AC_OUTPUT

 

 

3 )生成Makefile.am

这个得自己写,不过一般很简单,如下:

bin_PROGRAMS = hello

 

hello_SOURCES = test.c

bin_PROGRAMS 是定义生成的可执行文件的名称。

hello_SOURCES 是定义生成可执行文件hello, 需要通过哪些源文件去编译。如果生成多个二进制文件如A, B ,则需要定义A_SOURCE, B_SOURCE. 如果有nc 文件生成一个可执行文件,只需将这些文件一一列出以空格分开就可以了,如A_SOURCE= a1.c a2.c a3.c

 

 

4) 有了test.c Makefile.am configure.in, 则可以执行自动编译工具了。

运行autoreconf -i → ./configure –prefix=/usr → make → make install

可以通过make dist 生成tar 包。

2 , 简单的 gtk 程序编译。

 

1) 首先还是写源码 test.c 如下:

#include <gtk/gtk.h>

 

int main(int argc, char* argv[])

 

{

 

gtk_init(&argc, &argv);

 

GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 

g_signal_connect(G_OBJECT(window), "delete-event", gtk_main_quit, NULL);

 

gtk_window_set_default_size(GTK_WINDOW(window), 200,200);

 

gtk_widget_show(window);

 

gtk_main();

 

return 0;

 

}

 

2 )生成 configure.in.

需要在原来的基础上再做修改,添加了 3 行:

PKG_CHECK_MODULES(GTK, gtk+-2.0)

 

AC_SUBST([GTK_CFLAGS])

 

AC_SUBST([GTK_LIBS])

 

做这些修改的目的就是要告诉 makefile.am ,去哪里找 gtk 的头文件,去哪里找 gtk 的库文件,如果还用到了其他的库。则照格式写就行。

 

3) 生成 Makefile.am

Makefile.am 也在原来的基础上添加了两行:

hello_CFLAGS = ${GTK_CFLAGS}

 

hello_LDFLAGS = ${GTK_LIBS}

正如前面所说, Makefile.am 用到的这两个变量 GTK_CFLAGS, GTK_LIBS 正是前面 AC_SUBST 送过来的。

 

4 )编译运行。

 

autoreconf -i → ./configure –prefix=/usr → make → make install

 

 

3 。 带子目录,带国际化支持的简单 gtk 程序编译。

1 )还是先写程序吧。

 

在目录 src 下,生成 test.c 文件。

#include <glib/gi18n.h>

 

#include <locale.h>

 

#include <gtk/gtk.h>

 

#define GETTEXT_PACKAGE "hello"

 

int main(int argc, char* argv[])

 

{

 

gtk_init(&argc, &argv);

 

 

setlocale (LC_ALL, "");

 

bindtextdomain (GETTEXT_PACKAGE, "/usr/share/locale");

 

textdomain (GETTEXT_PACKAGE);

 

 

 

 

 

GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 

g_signal_connect(G_OBJECT(window), "delete-event", gtk_main_quit, NULL);

 

gtk_window_set_default_size(GTK_WINDOW(window), 200,200);

 

gtk_window_set_title(GTK_WINDOW(window),_("hello world"));

 

gtk_widget_show(window);

 

gtk_main();

 

return 0;

 

}

 

添加了头文件就不用说了,在 gtk_init 之后添加了 3 行:

setlocale (LC_ALL, "");

 

bindtextdomain (“hello”, "/usr/share/locale");

 

textdomain (“hello”);

 

 

setlocale 是用来设置语言环境的,这里设置为空,让程序根据环境变量 lang 或者 locate 来自动适应。

后两句可理解为告诉程序去那里找翻印文件即 mo 文件,一般在 /usr/share/locale 下,当然这种写法并不规范,因为把路径写死了。

最后还修改了一行:

gtk_window_set_title(GTK_WINDOW(window),_("hello world"));

 

需要翻译的字符串,需要按这种方式去写,以便于工具去提取需要翻译的字符串。

 

2 po 目录

在顶层目录下新建一个 po 子目录, touch 一个空的 LINGUAS 文件,这个文件是用来定义语言支持列表的,暂时为空。另外新加一个 POTFILES.in 文件,这个文件告诉 automake 相关工具去哪些源文件里面搜索需要翻译的字符串的,如下:

[encoding: UTF-8]

 

src/test.c

 

 

3 configure.in

configure.in 在原来的基础上又加了 4 行:

GETTEXT_PACKAGE=hello

 

AC_SUBST(GETTEXT_PACKAGE)

 

AM_GLIB_GNU_GETTEXT

 

IT_PROG_INTLTOOL(0.40.6)

 

都是用来支持国际化的,注意的是 GETTEXT_PACKAGE=hello 这个 hello 要跟程序里 textdomain 的等用的名称一致,否则翻译无效。

 

4 Makefile.am

这回需要写两个 Makefile.am 文件,顶极目录下的 Makefile.am

SUBDIRS = po src

相当简单,直接告诉他们去 po src 目录下执行编译就可以了。

src 目录下的 Makefile.am 保持跟原来的Makefile 一致。

 

5)生成 po 文件

运行 autoreconf -i 生成 configure 文件和  Makefile.in 文件。

 

运行 intltoolize   主要是生成 po 目录下的 Makefile . in.in 文件

 

./configure 生成 Makefile 文件。

 

po 目录下运行 make update-po, 生成 hello.pot   po 模板文件。

 

修改 po 文件夹里的 LINGUAS 文件,加一行 zh_CN, 加入中文简体支持,当然也可以加入其他语言的支持,每种语言占一行,可以去别的项目的 po 文件里查看这个文件了解语言的命名。

cp hello.pot zh_CN.po

如果还支持别的语言,如支持意大利语言,则 cp hello.pot it.po

修改 zh_CN.po 如下:

# SOME DESCRIPTIVE TITLE.

 

# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER

 

# This file is distributed under the same license as the PACKAGE package.

 

# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.

 

#

 

#, fuzzy

 

msgid ""

 

msgstr ""

 

"Project-Id-Version: PACKAGE VERSION/n"

 

"Report-Msgid-Bugs-To: /n"

 

"POT-Creation-Date: 2010-02-21 17:44+0800/n"

 

"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE/n"

 

"Last-Translator: FULL NAME <EMAIL@ADDRESS>/n"

 

"Language-Team: LANGUAGE <LL@li.org>/n"

 

"MIME-Version: 1.0/n"

 

"Content-Type: text/plain; charset=UTF-8/n"

 

"Content-Transfer-Encoding: 8bit/n"

 

 

 

#: ../src/test1.c:16

 

msgid "hello world"

 

msgstr " 你好 世界 "

 

主要修改的地方是 charset UTF-8, 然后就是一对一的翻译了。

 

 

6,编译

进入顶极目录运行 make, 正确的话会在 po 目录下生成 zh_CN.gmo

运行 make install

4 , 带资源文件程序编译

比如说图片文件,在顶层目录下建立文件夹 pixmaps, 将用到的图片拷贝到这个文件夹里,在。

1 )修改顶层目录下的 Makefile.am, 加一个子目录 pixmaps, 如下:

SUBDIRS = po src pixmaps

 

2) 修改 configure.in, AC_CONFIG_FILES 里面加上 pixmaps/Makefile, 如果用 autoscan, 则会在生成的模板 configure.scan 里自动加上。

 

3 )在 pixmaps 下,新建 Makefile.am 文件,如下:

picdir = $(pkgdatadir)/pixmaps

 

pic_DATA = *.png

 

 

 

EXTRA_DIST = *.png

 

 

注意命名规则, xxxdir,xxx_DATA, xxxdir 定义安装路径, xxx_DATA 定义安装的文件,支持通配符。安装路径一般要用到几个常用的变量, $(datadir) $(pkgdatadir) $(bindir) 等,注意到前面 configure 的时候,加上了— prefix=/usr, 对应关系如下:

datadir → /usr/share/

bindir → /usr/bin

pkgdatadir → /usr/share/ 包名(这里为 hello)

 

如果 configure 时没有加 prefix ,则对应关系如下:

datadir → /usr/local/share

bindir → /usr/local/bin

pkgdatadir → /usr/local/share/ 包名

 

注意到 EXTRA_DIST ,这个是用来定义在 make dist 的时候,将哪些文件打到 tar 包里面。

如果需要将文件安装到不同的路径,则可定义多个 xxxdir. xxx_DATA 组。

 

4 )编译安装

autoreconf -i

./configure –prefix=/usr

make

make install

 

看看是不是在 /usr/share/ 下新建立了文件夹 hello ,里面有安装的图片文件。

 

 

 

5 加入desktop 文件

1) 取得 icon 文件。放入 data 或者其他目录下。

 

2 )编写 desktop 文件。

[Desktop Entry]

 

Name= 英文名

Name[ja] = 日文名

Comment

英文注释(一般鼠标悬停时显示)

Comment[ja] = 日文注释

Exec = 执行的程序名

Icon = 显示的图标名(默认路径为 /usr/share/pixmaps 下,省略扩展名)

Categories = 分组名(根据这个信息进行自动分组 , 可能每个发行版的规则有点出入,需要去查看同组程序的写法)

 

3 )在 data 目录下编写 Makefile.am

 

deskdir = $(datadir)/applications/

desk_DATA = xxx.desktop

 

picdir = $(datadir)/pixmaps

pic_DATA = xxx.png

 

EXTRA_DIST = $(desk_DATA) $(pic_DATA)

 

4) 编译 .

 

6 总结

autoconf 一系列工具非常强大,也非常复杂,上面的例子只用到了一些最最基本的东西,以应付一些简单的工程。因为本人了解的也不多,所以如果遇到更复杂的需求,则需要靠自己去继续探索学习了。

 



版权声明:本文为博主原创文章,未经博主允许不得转载。



同类文章:编码