Ve velmi jednoduchém gtk2 c aplikací, nastavení problém up gnu vytvářet nástroje

hlasů
2

UPDATE: První problém vyřešen, druhý je popsán v dolní části tohoto příspěvku.

Update2: Druhý problém je vyřešen stejně.

Snažím se učit o nastavení GNU stavět nástroje (autoconf / automake) pro velmi jednoduché aplikace GTK + 2 C. Dodržel jsem tento návod a tento jeden, který se zabývá podadresáře , ale běžím do problému, kde je můj zdrojový adresář (v src podadresáři) není generování Makefile, ale Makefile nadřazeného adresáře je stále generován.

Za prvé, tady je můj struktura složek:

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

Zde je obsah důležitých souborů:

app / configure.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

app / Makefile.am:

SUBDIRS = src

app / src / Makefile.am:

bin_PROGRAMS = app

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

Zde je to, co se stane, když jsem běžet následující příkazy:

$ 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

Když jsem se zjistit, hlavní složka app dostane Makefile a Makefile.in, ale složka src má stále jen Makefile.am. Nějaké nápady?

UPDATE: jsem změny uvedené ADL, a to, jsem odstranil hranaté závorky a čárku z příkazu AC_CONFIG_FILES a odstranil aplikaci jméno / verzi z příkazu AM_INIT_AUTOMAKE. Také jsem změnil příkaz app_LDADD v src / Makefile.am na app_LDFLAGS. To má pevnou můj prvotní problém nedostávají přes configure, ale teď to není hledá GTK knihovny. Když jsem si make jsem si něco jako následující:

$ 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’

Zde je to, co jsem si s 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

Jsem si jistý, že dělám něco v mém src / Makefile.am špatně, ale já nevím co. Pokud to pomůže, můj skript configure se nezdá, že se dívá na případné gtk libs.

Update2:

Takže základní řešení problému v Update1 se zdá být, že musím přidat následující šek na mé configure.ac souboru:

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])

To dostane přidáno do kontrol pro sekci Programy pod AC_PROG_CC. Co to dělá, je říct configure pro kontrolu GTK + -2.0 knihovny. Verzálka GTK se zdá být libovolný název proměnné, a CFLAGS, LIBS a LDFLAGS (a pravděpodobně i více), dostane se k ní přidá dynamicky, takže můžete vygenerovat PACKAGE_ * proměnných. AC_SUBST Zdá se, aby to tak můžete přistupovat Balíček * proměnné v Makefile.am je. FYI se -export dynamický příznak, který zní tak, že můžete použít paseka / gtkbuilder souborů (Jsem si jistý, existují i ​​další důvody, ale já jsem stále na velmi základní úrovni porozumění).

V src / Makefile.am, měli byste mít:

bin_PROGRAMS = app

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

To se zdá být vše, co potřebujete pro základní gtk + -2.0 C app. Bylo mi vlastně inspirovalo k napsání jednoduchý návod pro zřízení C. gtk aplikaci, která používá autotools. Existuje určitý nedostatek nedávné začátečník dokumentace / informací v této oblasti.

Položena 04/07/2009 v 18:43
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
2

Dva problémy ve vašem configure.acsouboru. Za prvé, syntax vašeho AM_INIT_AUTOMAKEzaříkávání je 10 let staré, mám podezření jste jej zkopírovali z velmi starého tutoriálu (Tip: Automake manuální má úvod tutorialish ). Jste již prošel balíček a verzi AC_INIT, není třeba opakovat, že v AM_INIT_AUTOMAKE. Za druhé, seznam souborů, předaný AC_CONFIG_OUTPUTby měl být seznam prostor oddělený uveden jako první argument.

Jinými slovy, vaše configure.acby mělo vypadat

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

Poznámka: není bezvědomí na AC_CONFIG_FILESlince.

-WallVolba způsobí automakena výstupu více varování (to je opravdu automakemožnost, nikoli gccna přání), je to asi bezpečnější, když zjistíte, tyto nástroje.

To by mělo vyřešit váš configureproblém. Pak jsem podezření, budete pravděpodobně muset rozdělit app_LDADDřádek do app_CPPFLAGSa app_LDFLAGS.

Odpovězeno 05/07/2009 v 02:09
zdroj uživatelem

hlasů
1

Ještě pár otázek, které dosud nebyly uvedeny:

  • Použití autoreconf(re) generování configurea Makefile.in. Volá potřebné nástroje ve správném pořadí.
  • Preferují pomocí makemakra ( „ $(FOO)“) na substituce autoconf ( „ @FOO@“) v makefile. Výhodou první je, že mohou být přepsány v makedobě by to bylo nutné.
  • Já bych vás povzbudit k vytvoření samostatného sestavení adresáře a spustit configuretam spíše než stavba ve zdrojových adresářích. Jedná se o nastavení, které pravděpodobně nebudete chtít zlomit; a pokud jste to testování, můžete nechtěně zlomit to.
Odpovězeno 07/07/2009 v 20:13
zdroj uživatelem

hlasů
0

Spíše než přidávání GTK_CFLAGS a GTK_LDFLAGS vašich PACKAGE_CFLAGS, můžete jednoduše udělat:

app_LDADD = @ PACKAGE_LIBS @ @ @ GTK_LIBS

nebo, je-li u každé aplikace závisí na GTK, udělej

LDADD = @ @ GTK_LIBS

Určení -g a -Wall, jak jste je opravdu dobrá věc. Můžete to udělat mnohem snadněji tím, že definuje AM_CFLAGS, a když to je v pořádku pro -Wall, opravdu nechci -g tam. Výchozí konfigurace přidám -g na CFLAGS, a v případě, že uživatel přepíše CFLAGS při configure běžet, měli byste jim věřit, že vědí, co dělají, a dát jim svobodu přeskočit -g. Pokud přidáváte -g pro své vlastní pohodlí (takže není třeba specifikovat -g když zadáte CFLAGS na čase configure), že by bylo vhodnější použít CONFIG_SITE namísto napevno -g v promítat Postavme soubory ,

Odpovězeno 22/07/2009 v 11:18
zdroj uživatelem

hlasů
-1

Další možností by mohlo být následující:

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

Je to vždy dobrý nápad, aby se podívat na to, co vaše aclocal adresář (/ usr / aclocal) platí jako makro možností. Také nezapomeňte spustit aclocal takže požadované M4 makra dostane zkopírovány do aclocal.m4.

Odpovězeno 01/10/2009 v 21:43
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more