سؤال

تحديث: حل المشكلة الأولى، المرتبة الثانية الموصوفة في أسفل هذا المنصب.

تحديث 2: المشكلة الثانية حل كذلك.

أحاول أن أتعلم عن إعداد أدوات بناء جنو (Autoconf / automake) لتطبيق GTK + 2 C بسيط للغاية. لقد تابعت هذا البرنامج التعليمي و هذا واحد يتعامل مع الدلائل الفرعية, ، لكنني أهرب إلى مشكلة حيث لا يقوم دليل المصدر الخاص بي (في الدليل الفرعي SRC) بإنشاء MICFILE، على الرغم من أن Makefile Directory Directory يتم إنشاؤه.

أولا، إليك هيكل المجلد الخاص بي:

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

فيما يلي محتويات الملفات المهمة:

التطبيق / تكوينه:

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. أنا أيضا تغيير الأمر App_ldadd في SRC / Makefile.am إلى App_ldflags. لقد تم إصلاح هذا مشكلتي الأولية في عدم الحصول على تكوين، ولكن الآن لا يبحث عن مكتبات GTK. عندما أفعل جعل أحصل على شيء مثل ما يلي:

$ 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، لكنني لا أعرف ماذا. إذا كان ذلك يساعد، لا يبدو أن البرنامج النصي التكوين الخاص بي يبحث عن أي libs 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. ما يفعله هذا هو معرفة تكوين للتحقق من مكتبة GTK + -2.0. يبدو أن GTK الحالة العليا اسم متغير تعسفيا، ويتم إضافتها CFLAGS و LIBS و LDFLAGS (وربما أكثر) إليها دينيا بشكل حيوي حتى تتمكن من إنشاء متغيرات Package_ *. يبدو أن AC_SUBST جعلها تجعله حتى تتمكن من الوصول إلى الحزمة * المتغيرات في Makefile.am. FYI، تتم إضافة العلم الديناميكي -Export حتى تتمكن من استخدام ملفات 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 يستخدم Autotools. هناك نقص واضح في الوثائق / المعلومات المبتدئة الأخيرة في هذا المجال.

هل كانت مفيدة؟

المحلول

مسألتين في حياتك configure.ac ملف. أولا، بناء جملة الخاص بك AM_INIT_AUTOMAKE الاحتجاج يبلغ من العمر 10 سنوات، وأظن أنك نسخها من برنامج تعليمي قديم جدا (تلميح: دليل السيارات لديه مقدمة برامج تعليمية). لقد مرت بالفعل الحزمة والإصدار 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_CPPFLAGS و app_LDFLAGS.

نصائح أخرى

بعض القضايا الإضافية التي لم يتم ذكرها بعد:

  • يستخدم autoreconf إلى (إعادة) توليد configure و Makefile.in. وبعد يستدعي الأدوات المطلوبة بالترتيب الصحيح.
  • تفضل استخدام make وحدات ماكرو ("$(FOO)") إلى بدائل أوتوكونف ("@FOO@") في Makefile الخاص بك. ميزة السابق هو أنه يمكن تجاوزه في make الوقت يجب أن يكون ذلك ضروريا.
  • أود أن أشجعك على إنشاء دليل بناء منفصل وتشغيله configure هناك بدلا من البناء في الدلائل المصدر. هذا هو الإعداد الذي لا تريد كسره؛ وإذا كنت لا تختبرها، فيمكنك كسرها عن غير قصد.

بدلا من إضافة gtk_cflags و gtk_ldflags إلى package_cflags الخاص بك، يمكنك ببساطة القيام:

app_ldadd = @ package_libs @ @ gtk_libs @

أو، إذا كان كل تطبيق يعتمد على GTK، فقط تفعل

ldadd = @ gtk_libs @

تحديد -g ووحال الطريقة التي أنتها ليست حقا شيء جيد. يمكنك القيام بذلك بسهولة أكبر من خلال تحديد AM_CFLAGS، وبينما على ما يرام، لا تريد ذلك حقا. سيقوم التكوين الافتراضي بإضافة -غ إلى CFLAGS، وإذا تجاوز المستخدم CFLAGS عند تشغيل التكوين، يجب أن تثق بهم لمعرفة ما يفعلونه ومنحهم حرية تخطيهم. إذا كنت تضيفا - G للحصول على راحتك الخاصة (لذلك لا تحتاج إلى تحديد -غ عند تحديد CFLAGS في تكوين الوقت)، فسيكون الأمر أكثر ملاءمة لاستخدام CONFIG_SITE بدلا من الصغار وبعد

يمكن أن يكون خيار آخر لهذا ما يلي:

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