更新: 第一个问题已解决,第二个问题在本文底部描述。

更新2: 第二个问题也解决了。

我正在尝试了解如何为一个非常简单的 GTK+2 C 应用程序设置 GNU 构建工具(autoconf/automake)。我已经关注了 本教程这个处理子目录, ,但我遇到了一个问题,我的源目录(在 src 子目录中)没有生成 Makefile,尽管父目录的 Makefile 正在生成。

首先,这是我的文件夹结构:

app/src
  - main.c
  - main.h
  - Makefile.am
app
  - configure.ac
  - Makefile.am
  - aclocal.m4
  (... other generated files ...)

以下是重要文件的内容:

应用程序/配置.ac:

AC_PREREQ([2.63])
AC_INIT(app, 0.1)
AM_INIT_AUTOMAKE(app, 0.1)
AC_CONFIG_SRCDIR([src/main.h])
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], [src/Makefile])
AC_OUTPUT

应用程序/Makefile.am:

SUBDIRS = src

应用程序/src/Makefile.am:

bin_PROGRAMS = app

app_SOURCES = main.c
app_LDADD = `pkg-config --cflags --libs gtk+-2.0`

这是当我运行以下命令时发生的情况:

$ autoconf
$ automake -a
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables... 
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... none
configure: creating ./config.status
config.status: creating Makefile
./config.status: line 1153: src/Makefile: No such file or directory
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands

当我检查时,主应用程序文件夹得到一个 Makefile 和 Makefile.in,但 src 文件夹仍然只有 Makefile.am。有任何想法吗?

更新: 我进行了 adl 提到的更改,即从 AC_CONFIG_FILES 命令中删除了方括号和逗号,并从 AM_INIT_AUTOMAKE 命令中删除了应用程序名称/版本。我还将 src/Makefile.am 中的 app_LDADD 命令更改为 app_LDFLAGS。这解决了我最初无法完成配置的问题,但现在它不再寻找 gtk 库。当我执行 make 时,我会得到类似以下内容的信息:

$ make
make  all-recursive
make[1]: Entering directory `/home/adam/Development/app-0.1'
Making all in src
make[2]: Entering directory `/home/adam/Development/app-0.1/src'
if gcc -DHAVE_CONFIG_H -I. -I. -I..     -g -O2 -MT main.o -MD -MP -MF ".deps/main.Tpo" \
      -c -o main.o `test -f 'main.c' || echo './'`main.c; \
    then mv -f ".deps/main.Tpo" ".deps/main.Po"; \
    else rm -f ".deps/main.Tpo"; exit 1; \
    fi
main.c:3:21: error: gtk/gtk.h: No such file or directory
In file included from main.c:4:
main.h:4: error: expected specifier-qualifier-list before ‘GtkWidget’

这是我通过 pkg-config 得到的结果:

$ pkg-config --libs --cflags gtk+-2.0
-D_REENTRANT -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng12 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include  -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lgio-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0

我很确定我在 src/Makefile.am 中做错了什么,但我不知道是什么。如果有帮助的话,我的配置脚本似乎没有寻找任何 gtk 库。

更新2:

因此 update1 中问题的基本解决方案似乎是我需要将以下检查添加到我的configure.ac 文件中:

PKG_CHECK_MODULES(GTK, [gtk+-2.0 >= 2.12])

PACKAGE_CFLAGS="-g -Wall $GTK_CFLAGS"
PACKAGE_LIBS="-g $GTK_LIBS"
PACKAGE_LDFLAGS="-export-dynamic $GTK_LDFLAGS"

AC_SUBST([PACKAGE_CFLAGS])
AC_SUBST([PACKAGE_LIBS])
AC_SUBST([PACKAGE_LDFLAGS])

这被添加到 AC_PROG_CC 下的程序检查部分。它的作用是告诉configure 检查gtk+-2.0 库。大写 GTK 似乎是任意变量名称,CFLAGS、LIBS 和 LDFLAGS(可能还有更多)会动态添加到其中,以便您可以生成 PACKAGE_* 变量。AC_SUBST 似乎可以做到这一点,以便您可以访问 Makefile.am 中的 PACKAGE* 变量。仅供参考,添加了 -export-dynamic 标志,以便您可以使用glade/gtkbuilder 文件(我确信还有其他原因,但我仍处于非常基本的理解水平)。

在 src/Makefile.am 中,您应该具有:

bin_PROGRAMS = app

app_SOURCES = main.c main.h 
app_LDADD = @PACKAGE_LIBS@
app_LDFLAGS = @PACKAGE_LDFLAGS@
INCLUDES = @PACKAGE_CFLAGS@

这似乎是基本 gtk+-2.0 C 应用程序所需的全部。它实际上激励我编写一个简单的教程来设置使用自动工具的 C gtk 应用程序。该领域确实缺乏最新的初学者文档/信息。

有帮助吗?

解决方案

您的两个问题 configure.ac 文件。首先,你的语法 AM_INIT_AUTOMAKE 调用已经有 10 年历史了,我怀疑你是从一个非常旧的教程中复制的(提示:Automake手册有一个 教程式的介绍)。您已经将包和版本传递给 AC_INIT, ,无需重复 AM_INIT_AUTOMAKE. 。二、传递到的文件列表 AC_CONFIG_OUTPUT 应该是作为第一个参数给出的空格分隔列表。

换句话说,你的 configure.ac 应该看起来像

AC_PREREQ([2.63])
AC_INIT([app], [0.1], [your@email])
AM_INIT_AUTOMAKE([-Wall])
AC_CONFIG_SRCDIR([src/main.h])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT

请注意,上没有昏迷 AC_CONFIG_FILES 线。

-Wall 选项将导致 automake 输出更多警告(这确实是一个 automake 选项,不是 gcc 选项),如果您发现这些工具可能会更安全。

这应该可以解决你的问题 configure 问题。那么我怀疑你可能不得不分开你的 app_LDADD 线入 app_CPPFLAGSapp_LDFLAGS.

其他提示

还有几个还没提到的问题:

  • 使用 autoreconf (重新)生成 configureMakefile.in. 。它以正确的顺序调用必要的工具。
  • 更喜欢使用 make 宏(“$(FOO)”) 到 Autoconf 替换 (“@FOO@”) 在你的 makefile 中。前者的优点是它们可以被覆盖 make 时间应该是必要的。
  • 我鼓励您创建一个单独的构建目录并运行 configure 那里而不是在源目录中构建。这是您可能不想破坏的设置;如果你不测试它,你可能会无意中破坏它。

您可以简单地执行以下操作,而不是将 GTK_CFLAGS 和 GTK_LDFLAGS 添加到 PACKAGE_CFLAGS:

app_LDADD = @PACKAGE_LIBS@ @GTK_LIBS@

或者,如果每个应用程序都依赖于 gtk,那么就这样做

LDADD = @GTK_LIBS@

按照您的方式指定 -g 和 -Wall 并不是一件好事。您可以通过定义 AM_CFLAGS 更轻松地做到这一点,虽然这对于 -Wall 来说很好,但您确实不希望在那里使用 -g 。默认配置会将 -g 添加到 CFLAGS,如果用户在运行配置时覆盖 CFLAGS,您应该相信他们知道自己在做什么,并给他们跳过 -g 的自由。如果您为了自己的方便而添加 -g (因此在配置时指定 CFLAGS 时不需要指定 -g),那么使用 CONFIG_SITE 而不是在项目的构建文件中硬编码 -g 会更合适。

另一种选择可能如下:

AM_PATH_GTK_2_0([Min version], [Succes], [Failure])
AM_PATH_GLIB_2_0([Min version], [Succes], [Failure])

查看 aclocal 目录 (/usr/aclocal) 中包含哪些宏可能性总是一个好主意。另外,不要忘记运行 aclocal,以便将所需的 M4 宏复制到 aclocal.m4。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top